如何让这个正则表达式匹配失败?

问题描述 投票:1回答:2

我想要一个匹配两位数年份范围的正则表达式和CaterpillarFord这样的单词:

ABC123 08-10 Caterpillar

但不是这个:

ABC123 fits 08-10 Caterpillar

或这个:

ABC123 for 08-10 Caterpillar XYZ789

ABC123XYZ789可以变化,包含任何东西。

我正在尝试用Caterpillar替换fits Caterpillar这个词,但是我不想在已经包含gsubfits的字符串上这样做。捕获是重要的,以便我可以弄清楚如何做for

我写了这个:

gsub

但上面的正则表达式匹配我的所有三个示例字符串。所以我的否定词是不正确的。年份范围需要是可选的。我想把它放在方括号中,但我不认为我这样做是正确的,我认为这是表示范围。

regex ruby regex-negation
2个回答
2
投票

我将通过一些修改将我的评论转换成答案。使用以下正则表达式查找匹配项:

/([^fits]\s?\d{2}-\d{2}\s*(Ford|Caterpillar))/

注意:(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S) 是必要的。

并为替换字符串:

\b

\1fits \2

Ruby代码:

live demo here

说明:

你当前的正则表达式带有语义错误:re = /(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S)/ str = 'ABC123 08-10 Caterpillar ABC123 fits 08-10 Caterpillar ABC123 for 08-10 Caterpillar XYZ789' subst = '\\1fits \\2' print str.gsub(re, subst) 并不意味着[^fits],但它意味着一个既不是fitsfi,也不是t的角色。你需要一个环顾(lookahead / lookbehind)来表达字符串的否定。

我使用lookbehind这样说和负面的先行来检查在sCaterpillar之后是否有非空格字符。


0
投票

下面的正则表达式符合您的要求,但您将完成替换部分

看到我使用了否定前瞻(?!)来排除字符串“适合”的行

Ford

你可以测试这个正则表达式^(((?!fits).)*((\d{2}-\d{2}\s)Caterpillar))$

© www.soinside.com 2019 - 2024. All rights reserved.