下面的正则表达式与下面的所有三个示例匹配。
(?!\d+)(bn)
325bn
325 bn
424bn
我只想匹配
325bn
424bn
更具体地说,我只想在数字前匹配bn
答案 0 :(得分:3)
您的正则表达式将与任何bn
相匹配,无论如何。由于前行放置在(bn)
之前,因此它将始终计算为true
(感谢@WiktorStribiżew)。
但是,即使在正确的位置,(bn)(?!\d+)
也将匹配任何不跟数字(positive/negative lookarounds
)的bn
。
因此所有这些都将匹配:
sj bn bn bn bn bn
somethingbn
这不是您想要的。
据我了解,您只需要匹配放在某些数字后面的bn
。你为什么不随便走?
\d+(bn)
325bn ---> Match
325 bn
424bn ---> Match
sj bn bn bn bn bn
somethingbn
如@revo所述,使用环顾四周解决方案以了解其工作原理可能会有所帮助。
(?<=\d)bn
这是positive lookbehind
。这告诉 regex引擎暂时向后退字符串,以检查后面的内部文本是否可以匹配。
答案 1 :(得分:0)
利用示例数据和预期的匹配,您似乎确实想在后面使用正向外观,但最终却错误地使用了负向外观。而且,很少支持量化的\d+
后跟(.NET支持)。
如您所写,您更具体地希望只匹配数字前的bn
,可以将正则表达式更改为此,
(?<=\d)bn\b
如果bn
前面有一个数字,并且\b
确保bn
与以bn
开头的大字不匹配,则确保匹配{p >
答案 2 :(得分:0)
您的模式(?!\d+)(bn)
读为断言,直接在右边的不是1位数字。这是正确的,因为其后跟bn
您可以使用带有单词边界的捕获组,而不是正向查找:
\b\d+(bn)\b
如果应该在字符串的开头或空白字符(?:\s|^)
的前面,并且只能在后面加上非空白字符(?!\S)
,则可以使用:
(?:\s|^)\d+(bn)(?!\S)
答案 3 :(得分:0)