要匹配不区分大小写的单词i.v.有图案
i.v.
(?i)\bi\.v\.
但希望在结尾有一个字边界上面的模式失败,因为它匹配静脉注射但如果我尝试在末尾添加工作边界
(?i)\bi\.v\.\b
它失败了,因为它甚至不匹配iidov.,因为我认为\b正在吃字面意思。as .是一个断字需要\.是贪婪的我要匹配三诉三不想匹配静脉注射i.v.sam这一点越来越近了
\b
\.
(?i)\bi\.v\.\s$
但在一行末尾找不到静脉注射
e7arh2l61#
\b只匹配字母数字字符和非字母数字字符(或字符串的开始/结束)。因此,它不匹配.后面的字符,除非该点后面紧跟字母数字字符。如果要确保点后面没有非空白字符,则可以使用negative lookahead assertion:
.
(?i)\bi\.v\.(?!\S)
(?!\S)表示“Assert下一个字符不是非空白字符”。这听起来可能有点复杂--为什么是双重否定?为什么不是(?=\s),意思是“Assert下一个字符是空格字符”?嗯,这有一个微妙的区别:第二个版本需要一个空白字符;这意味着正则表达式在字符串的末尾无法匹配。第一个正则表达式也处理这种情况。如果您通常希望“单词边界”的概念表示“空格分隔”,那么您还需要替换第一个\b:
(?!\S)
(?=\s)
(?i)(?<!\S)i\.v\.(?!\S)
或者正则表达式将匹配sam.i.v.,而您似乎并不希望它这样做。
sam.i.v.
pbgvytdp2#
关于您当前的正则表达式:你不需要在dot后面加上\b,因为dot不被认为是单词字符,但是dot当然需要转义:
但是,在i之前需要\b,以确保它不匹配,例如hi
i
hi
编辑:(基于您得进一步编辑)
请尝试以下正则表达式:
(?i)\bi\.v\.(?=\s|$)
bprjcwpo3#
你也可以用边界来代替最后一个点。
(?i)\bi\.v\b
唯一缺点是它也将匹配i.v.
8wigbo564#
你似乎对词语的界限和贪婪的观念很困惑。你能做的最好的事情就是去这些地址:
http://www.regular-expressions.info/repeat.html
http://www.regular-expressions.info/wordboundaries.html当你读到这些解释时,我相信你会认为你的问题是荒谬的。
4条答案
按热度按时间e7arh2l61#
\b
只匹配字母数字字符和非字母数字字符(或字符串的开始/结束)。因此,它不匹配.
后面的字符,除非该点后面紧跟字母数字字符。如果要确保点后面没有非空白字符,则可以使用negative lookahead assertion:
(?!\S)
表示“Assert下一个字符不是非空白字符”。这听起来可能有点复杂--为什么是双重否定?为什么不是
(?=\s)
,意思是“Assert下一个字符是空格字符”?嗯,这有一个微妙的区别:第二个版本需要一个空白字符;这意味着正则表达式在字符串的末尾无法匹配。第一个正则表达式也处理这种情况。如果您通常希望“单词边界”的概念表示“空格分隔”,那么您还需要替换第一个
\b
:或者正则表达式将匹配
sam.i.v.
,而您似乎并不希望它这样做。pbgvytdp2#
关于您当前的正则表达式:
你不需要在dot后面加上
\b
,因为dot不被认为是单词字符,但是dot当然需要转义:但是,在
i
之前需要\b
,以确保它不匹配,例如hi
编辑:(基于您得进一步编辑)
请尝试以下正则表达式:
bprjcwpo3#
你也可以用边界来代替最后一个点。
唯一缺点是它也将匹配i.v.
8wigbo564#
你似乎对词语的界限和贪婪的观念很困惑。你能做的最好的事情就是去这些地址:
http://www.regular-expressions.info/repeat.html
http://www.regular-expressions.info/wordboundaries.html
当你读到这些解释时,我相信你会认为你的问题是荒谬的。