15

想要匹配单词i.v.不区分大小写

有图案

(?i)\bi\.v\.

但是想要一个单词边界,
上面的模式失败了,因为它匹配
ivx

但是如果我尝试在最后添加一个工作边界

(?i)\bi\.v\.\b

它的失败在于它甚至不匹配 iv 因为我认为它\b正在吃字面。作为 。是断字
需要\.贪心吗

我想匹配
sam iv sam

不想匹配
sam.iv
ivsam

这越来越近

(?i)\bi\.v\.\s$

但它无法在行尾找到 iv

4

3 回答 3

25

\b仅在字母数字字符和非字母数字字符(或字符串的开头/结尾)之间匹配。因此,它在 a 之后不匹配.,除非字母数字字符紧跟该点。

如果您的意图是确保在点之后没有非空白字符,那么您可以指定使用否定的前瞻断言

(?i)\bi\.v\.(?!\S)

(?!\S)表示“断言下一个字符不是非空白字符”。

这听起来有点令人费解——为什么要双重否定?为什么不(?=\s)表示“断言下一个字符是空白字符”?嗯,有一个微妙的区别:第二个版本需要一个空白字符。这意味着正则表达式将无法匹配字符串的末尾。第一个正则表达式也处理那个极端情况。

如果您通常希望“单词边界”的概念表示“空格分隔”,那么您还需要替换第一个\b

(?i)(?<!\S)i\.v\.(?!\S)

或者正则表达式将匹配sam.i.v.您似乎不想要的。

于 2013-08-01T21:59:38.273 回答
2

关于您当前的正则表达式:

您不需要\b在 dot 之后,因为 dot 不被视为单词字符,但当然 dot 需要转义:

(?i)\bi\.v\.

但是您确实需要\bi确保它不匹配,例如hi

编辑:(根据您的进一步编辑)

试试这个正则表达式:

(?i)\bi\.v\.(?=\s|$)
于 2013-08-01T21:32:03.170 回答
-3

您似乎对单词边界和贪婪的概念感到非常困惑。你能做的最好的事情就是去这些地址:

  • 什么是贪心量词:

http://www.regular-expressions.info/repeat.html

  • 什么是单词边界:

http://www.regular-expressions.info/wordboundaries.html

当您阅读这些解释时,我相信您会认为您的问题很荒谬。

于 2013-08-01T21:40:32.077 回答