regex 使用单词边界但单词以.(句点)结尾的正则表达式

k5hmc34c  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(143)

要匹配不区分大小写的单词i.v.
有图案

(?i)\bi\.v\.

但希望在结尾有一个字边界
上面的模式失败,因为它匹配
静脉注射
但如果我尝试在末尾添加工作边界

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

它失败了,因为它甚至不匹配iidov.,因为我认为\b正在吃字面意思。as .是一个断字
需要\.是贪婪的
我要匹配
三诉三
不想匹配
静脉注射
i.v.sam
这一点越来越近了

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

但在一行末尾找不到静脉注射

e7arh2l6

e7arh2l61#

\b只匹配字母数字字符和非字母数字字符(或字符串的开始/结束)。因此,它不匹配.后面的字符,除非该点后面紧跟字母数字字符。
如果要确保点后面没有非空白字符,则可以使用negative lookahead assertion

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

(?!\S)表示“Assert下一个字符不是非空白字符”。
这听起来可能有点复杂--为什么是双重否定?为什么不是(?=\s),意思是“Assert下一个字符是空格字符”?嗯,这有一个微妙的区别:第二个版本需要一个空白字符;这意味着正则表达式在字符串的末尾无法匹配。第一个正则表达式也处理这种情况。
如果您通常希望“单词边界”的概念表示“空格分隔”,那么您还需要替换第一个\b

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

或者正则表达式将匹配sam.i.v.,而您似乎并不希望它这样做。

pbgvytdp

pbgvytdp2#

关于您当前的正则表达式:
你不需要在dot后面加上\b,因为dot不被认为是单词字符,但是dot当然需要转义:

(?i)\bi\.v\.

但是,在i之前需要\b,以确保它不匹配,例如hi

编辑:(基于您得进一步编辑)

请尝试以下正则表达式:

(?i)\bi\.v\.(?=\s|$)
bprjcwpo

bprjcwpo3#

你也可以用边界来代替最后一个点。

(?i)\bi\.v\b

唯一缺点是它也将匹配i.v.

8wigbo56

8wigbo564#

你似乎对词语的界限和贪婪的观念很困惑。你能做的最好的事情就是去这些地址:

  • 什么是贪婪量词:

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

  • 什么是字边界:

http://www.regular-expressions.info/wordboundaries.html
当你读到这些解释时,我相信你会认为你的问题是荒谬的。

相关问题