如何使用 gsub 替换所有以 "border-" 开头的 类?
How can I replace all classes that start with "border-" using gsub?
我目前正在这样做,效果很好
html_tag.gsub("border-gray-300", "border-red-500")
我现在需要 gsub
border-
和 border-red-500
之后的所有内容
例如border-gray-500
或border-blue-50
都需要returnborder-red-500
。我还不太擅长正则表达式,有人可以帮助我入门吗?
定义数据样本
您的原始问题缺乏精确性(例如,我们是在谈论内联样式属性、样式标签还是 CSS 属性?)以及 include/exclude 内容的有效、可测试示例。所以,让我们创建一个。例如:
# here-document containing style and class tags
# that we can use as a test fixture
html_tag = <<~'INLINE_STYLES'
<h1 style="border-color: lightgrey;"></h1>
<h2 class="border-red-500"></h2>
<h3 style="foo; border-collie;"></h3>
<h4 class="focus:border-indigo-500"></h4>
<h5 style="border-style: 1px;"></h5>
<h6 class="border-collie" style="border: 5px solid red;">border-</h6>
INLINE_STYLES
鉴于此示例数据,您可以了解为什么定义测试输入和预期输出很重要。你的表达式应该用 border-style
做什么?我们是否应该忽略它,因为它是样式属性而不是 class?还是也应该改变?对于这个答案,我们假设您只想更改 classes 而不是内联样式、样式标签内的属性或外部 CSS 文件。
区别于 类
的风格
您可能需要根据您的真实目标数据对下面的程序逻辑和正则表达式进行一些调整,因为“可能可行的最简单的事情”通常会随着数据的变化而变化。不太可能有一个单一的规范解决方案来处理所有可能的边缘情况。
考虑到这一点,您可以将以下内容与上面的示例数据一起使用:
border_class_tag =
/
( # capture group for replacement string
class=" # class attribute with opening doublequote
.*? # non-greedy match until...
)
# text to be replaced, a.k.a. \&
(?<!:) # not immediately preceded by a colon
border- # a class that starts with "border-"
[^"]+ # anything not a closing doublequote
(?=") # immediately followed by a doublequote
/ix
puts html_tag.gsub border_class_tag, 'border-red-500'
这将在标准输出中呈现以下内容:
<h1 style="border-color: lightgrey;"></h1>
<h2 class="border-red-500"></h2>
<h3 style="foo; border-collie;"></h3>
<h4 class="focus:border-indigo-500"></h4>
<h5 style="border-style: 1px;"></h5>
<h6 class="border-red-500" style="border: 5px solid red;">border-</h6>
考虑到定义的期望和样本,我认为这看起来很正确。您的里程可能会有所不同。
我目前正在这样做,效果很好
html_tag.gsub("border-gray-300", "border-red-500")
我现在需要 gsub
border-
和 border-red-500
例如border-gray-500
或border-blue-50
都需要returnborder-red-500
。我还不太擅长正则表达式,有人可以帮助我入门吗?
定义数据样本
您的原始问题缺乏精确性(例如,我们是在谈论内联样式属性、样式标签还是 CSS 属性?)以及 include/exclude 内容的有效、可测试示例。所以,让我们创建一个。例如:
# here-document containing style and class tags
# that we can use as a test fixture
html_tag = <<~'INLINE_STYLES'
<h1 style="border-color: lightgrey;"></h1>
<h2 class="border-red-500"></h2>
<h3 style="foo; border-collie;"></h3>
<h4 class="focus:border-indigo-500"></h4>
<h5 style="border-style: 1px;"></h5>
<h6 class="border-collie" style="border: 5px solid red;">border-</h6>
INLINE_STYLES
鉴于此示例数据,您可以了解为什么定义测试输入和预期输出很重要。你的表达式应该用 border-style
做什么?我们是否应该忽略它,因为它是样式属性而不是 class?还是也应该改变?对于这个答案,我们假设您只想更改 classes 而不是内联样式、样式标签内的属性或外部 CSS 文件。
区别于 类
的风格您可能需要根据您的真实目标数据对下面的程序逻辑和正则表达式进行一些调整,因为“可能可行的最简单的事情”通常会随着数据的变化而变化。不太可能有一个单一的规范解决方案来处理所有可能的边缘情况。
考虑到这一点,您可以将以下内容与上面的示例数据一起使用:
border_class_tag =
/
( # capture group for replacement string
class=" # class attribute with opening doublequote
.*? # non-greedy match until...
)
# text to be replaced, a.k.a. \&
(?<!:) # not immediately preceded by a colon
border- # a class that starts with "border-"
[^"]+ # anything not a closing doublequote
(?=") # immediately followed by a doublequote
/ix
puts html_tag.gsub border_class_tag, 'border-red-500'
这将在标准输出中呈现以下内容:
<h1 style="border-color: lightgrey;"></h1>
<h2 class="border-red-500"></h2>
<h3 style="foo; border-collie;"></h3>
<h4 class="focus:border-indigo-500"></h4>
<h5 style="border-style: 1px;"></h5>
<h6 class="border-red-500" style="border: 5px solid red;">border-</h6>
考虑到定义的期望和样本,我认为这看起来很正确。您的里程可能会有所不同。