单词边界
元字符b 是位置匹配的“锚点”。该匹配是0 长度匹配。
有4 个位置被视为“字边界”:
如果字符串的第一个字符是“单词字符”,则为字符串的第一个字符之前的位置如果字符串的最后一个字符是“单词字符”,则为字符串的最后一个字符之后的位置当为“非”时-单词字符”紧跟在“单词字符”之后,位于“单词字符”和“非单词字符”之间当“单词字符”紧跟在“非单词字符”之后,位于“非单词字符”之间字符”和“非单词字符” 在“单词字符”之间与“w”匹配的字符
“非单词字符” 与“W”匹配的字符
在大多数正则表达式实现中,“单词字符”通常包括[a-zA-Z0-9_]
例子
正则表达式b4b
匹配单个4,而不是较大数字的一部分(不匹配44 中的4)
也就是说,几乎可以说b 匹配“字母数字序列”的开头和结尾。
“字边界”的否定集是B
他要匹配的位置是两个“单词字符”之间或者两个“非单词字符”之间的位置。
深入正则表达式引擎内部
示例
正则表达式bisb
字符串这个岛很美丽
引擎首先处理符号b
因为b 的长度为0,所以检查第一个字符T 之前的位置。
T是一个“单词字符”,它前面的字符是空字符(void)。这是单词边界,b 匹配成功。
但是正则表达式中的i和第一个字符T匹配失败,回溯~
单词边界b 继续匹配。第五个空格字符和第四个字符s 之间有一个单词边界。 b 匹配成功。
但是i和正则表达式中第五个空格字符匹配失败,回溯~
单词边界b 继续匹配。第五个空格字符和第六个字符i 之间存在单词边界。 b 匹配成功。
正则表达式成功匹配第6 个和第7 个字符。
但第8个字符l与单词边界b不匹配,匹配失败,回溯~
单词边界b继续匹配,第13个字符i和前面的空格字符形成“单词边界”,并且is和is同时匹配。正则表达式中的第二个b开始匹配,
单词s 及其后面的空格字符是单词边界,b 匹配成功。
正则表达式结束。
引擎“急忙”返回匹配成功的结果。
选择符
“|”正则表达式中表示选择。您可以使用选择器来匹配多个可能的正则表达式之一。
如果你想匹配文本“cat”或“dog”
正则表达式猫|狗
如果你想要更多匹配,只需添加cat|dog|mouse|fish
选择器在正则表达式中具有最低优先级,这意味着它告诉引擎匹配选择器左侧的所有表达式或右侧的所有表达式。
您还可以使用括号来限制选择器的范围。
例子
b(cat|dog)b 告诉正则引擎将(cat|dog) 视为正则表达式单元。
正则表达式引擎是急切的:当它找到有效的匹配时,它会停止搜索。
因此,在某些条件下,选择器两侧表达式的顺序都会影响结果。
例子
使用正则表达式搜索编程语言的函数列表
Get 或GetValue 或Set 或SetValue
一个明显的解决方案是正则表达式Get|GetValue|Set|SetValue
结果
因为正则表达式Get和GetValue都匹配失败,而Set匹配成功。因为面向正则的引擎是“渴望的”,所以它会返回第一个成功的匹配,即文本Set,而不会继续搜索其他更好的匹配。
与我们的预期相反,正则表达式没有匹配整个字符串。有几种可能的解决方案。
1.改变选项的顺序,例如我们使用正则表达式GetValue|Get|SetValue|Set,这样我们就可以先搜索最长的匹配。
2. 将四个选项合并为两个选项Get(Value)?|Set(Value)?
因为问号重复器是贪婪的,所以SetValue总是会先于Set进行匹配。
3.更好的解决方案是使用字边界
b(Get|GetValue|Set|SetValue)b 或b(Get(值)?|Set(值)?b
由于所有选择都有相同的结尾,因此正则表达式可以优化为b(Get|Set)(Value)?b
组与向后引用
您可以通过将正则表达式的各个部分放在括号内来对它们进行分组。
然后,您可以对整个组使用一些常规操作,例如重复运算符。
注意差异
() 括号用于构成正则表达式组
[]用于定义字符集
{}用于定义重复操作
当使用()定义正则表达式组时,正则表达式引擎会对匹配到的组按顺序编号,并将其存储在缓存中。
向后引用匹配组时,可以使用“number”来引用它。
正则表达式1 指第一个匹配的反向引用组,2 指第二组,依此类推,n 指第n 个组。