负前瞻正则表达式之间没有空格

时间:2019-04-18 08:32:37

标签: regex

下面的正则表达式与下面的所有三个示例匹配。

(?!\d+)(bn)

325bn
325 bn
424bn

我只想匹配

325bn
424bn

更具体地说,我只想在数字前匹配bn

4 个答案:

答案 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

Demo

积极回望的解决方案

如@revo所述,使用环顾四周解决方案以了解其工作原理可能会有所帮助。

(?<=\d)bn

这是positive lookbehind。这告诉 regex引擎暂时向后退字符串,以检查后面的内部文本是否可以匹配

答案 1 :(得分:0)

利用示例数据和预期的匹配,您似乎确实想在后面使用正向外观,但最终却错误地使用了负向外观。而且,很少支持量化的\d+后跟(.NET支持)。

如您所写,您更具体地希望只匹配数字前的bn,可以将正则表达式更改为此,

(?<=\d)bn\b

如果bn前面有一个数字,并且\b确保bn与以bn开头的大字不匹配,则确保匹配{p >

Regex Demo

答案 2 :(得分:0)

您的模式(?!\d+)(bn)读为断言,直接在右边的不是1位数字。这是正确的,因为其后跟bn

您可以使用带有单词边界的捕获组,而不是正向查找:

\b\d+(bn)\b

Regex demo

如果应该在字符串的开头或空白字符(?:\s|^)的前面,并且只能在后面加上非空白字符(?!\S),则可以使用:

(?:\s|^)\d+(bn)(?!\S)

Regex demo

答案 3 :(得分:0)

  

更具体地说,我只想在数字前匹配bn

顺序很重要,那么它应该正面提前。

(bn)(?=\d+)

Demo