正则表达式使用单词边界但单词以a结尾。 (期)

时间:2013-08-01 21:29:53

标签: .net regex

希望匹配字i.v.不区分大小写的

有模式

(?i)\bi\.v\.

但最后想要一个单词边界
上述模式失败,因为它匹配
i.v.x

但如果我尝试在末尾添加工作边界

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

失败的原因是它甚至不匹配i.v. 因为我认为\b正在吃文字。作为。是一个断言词 需要\.贪婪

我想匹配
山姆i.v.山姆

不想匹配
sam.i.v.
i.v.sam

这更接近

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

但它未能找到i.v.在一行

3 个答案:

答案 0 :(得分:17)

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

如果您的目的是确保点后面没有非空白字符,那么您可以使用negative lookahead assertion指定:

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

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

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

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

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

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

答案 1 :(得分:2)

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

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

(?i)\bi\.v\.

但是您需要在\b之前i确保它不匹配,例如hi(?i)\bi\.v\.(?=\s|$)

编辑(根据您的进一步修改)

试试这个正则表达式:

{{1}}

答案 2 :(得分:-1)

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

  • 什么是贪婪的量词:

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

  • 什么是单词边界:

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

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