匹配属性名称中包含特殊字符的属性单元的正则表达式
Regular Expression that matches attribute units in attribute names including special characters
我对使用正则表达式还很陌生,而且我被困在一个我试图解决的问题上。我无法理解正在发生的事情,我希望有人能给我指明正确的方向。
我想要实现的目标:
为了避免视图中出现重复,我想检查属性名称是否包含相应的属性单元。例如,如果 $attribute['name'] = "Cutting speed (in m/Min.)"
和 attribute['unit'] = "m/min"
属性单元不应显示,因为它已在名称中提及。
我是如何实现的:
我正在使用以下正则表达式检查属性单元:~\b' . attribute['unit'] . '\b~i'
这适用于上述示例,但如果单位是特殊字符,例如 %
或 "
,则效果不佳。
问题
在测试特殊字符问题时,我遇到了以下现象:
如果我使用此正则表达式 /\b%\b/
它的行为与预期不符并且匹配 bla%bla
中的 %
但不匹配 %
如果它之前或之后是space: https://regex101.com/r/56iYEI/3
似乎 % 将正则表达式的行为变为相反。我也测试了其他"special characters"("和&),它们似乎有相同的效果。
我之前被引导到这个问题 (Regular Expression Word Boundary and Special Characters) 并阅读了答案。我现在明白 \b
检查单词边界。但我仍然不清楚为什么它会在 %
或 "
出现时表现得如此。
问题
- 为什么
%
将单词边界检查改变 \b
左右?
- 如何实现我的目标来匹配字母数字单元以及特殊字符单元,例如
%
或 "
?
期待任何提示。提前致谢!
分词是一串单词字符和一串非单词字符(或开始或结束)之间的点。非单词字符不必是 space.
foo"@#bar {}qux
在此字符串中,单词 break 位于 foo
、bar
和 qux
之前和之后。
表达式 /\b"@#\b/
will match chars between foo
and bar
. However /\b"@\b/
不会,因为 @
之后没有单词(因此没有分词)。
要解决此问题,请检查分词符或非单词字符。以下表达式匹配两种情况; /(^|\W|\b)"@($|\W|\b)/
.
'~(^|\W|\b)' . attribute['unit'] . '($|\W|\b)~i'
P.S。如果 attribute['unit']
可以包含任何字符,请务必在使用 preg_quote()
.
在正则表达式中使用它之前引用
我对使用正则表达式还很陌生,而且我被困在一个我试图解决的问题上。我无法理解正在发生的事情,我希望有人能给我指明正确的方向。
我想要实现的目标:
为了避免视图中出现重复,我想检查属性名称是否包含相应的属性单元。例如,如果 $attribute['name'] = "Cutting speed (in m/Min.)"
和 attribute['unit'] = "m/min"
属性单元不应显示,因为它已在名称中提及。
我是如何实现的:
我正在使用以下正则表达式检查属性单元:~\b' . attribute['unit'] . '\b~i'
这适用于上述示例,但如果单位是特殊字符,例如 %
或 "
,则效果不佳。
问题
在测试特殊字符问题时,我遇到了以下现象:
如果我使用此正则表达式 /\b%\b/
它的行为与预期不符并且匹配 bla%bla
中的 %
但不匹配 %
如果它之前或之后是space: https://regex101.com/r/56iYEI/3
似乎 % 将正则表达式的行为变为相反。我也测试了其他"special characters"("和&),它们似乎有相同的效果。
我之前被引导到这个问题 (Regular Expression Word Boundary and Special Characters) 并阅读了答案。我现在明白 \b
检查单词边界。但我仍然不清楚为什么它会在 %
或 "
出现时表现得如此。
问题
- 为什么
%
将单词边界检查改变\b
左右? - 如何实现我的目标来匹配字母数字单元以及特殊字符单元,例如
%
或"
?
期待任何提示。提前致谢!
分词是一串单词字符和一串非单词字符(或开始或结束)之间的点。非单词字符不必是 space.
foo"@#bar {}qux
在此字符串中,单词 break 位于 foo
、bar
和 qux
之前和之后。
表达式 /\b"@#\b/
will match chars between foo
and bar
. However /\b"@\b/
不会,因为 @
之后没有单词(因此没有分词)。
要解决此问题,请检查分词符或非单词字符。以下表达式匹配两种情况; /(^|\W|\b)"@($|\W|\b)/
.
'~(^|\W|\b)' . attribute['unit'] . '($|\W|\b)~i'
P.S。如果 attribute['unit']
可以包含任何字符,请务必在使用 preg_quote()
.