如何使此正则表达式匹配失败?

时间:2019-03-07 22:24:44

标签: regex ruby regex-negation

我想要一个正则表达式,该年份与两位数的年份范围匹配,并且像这样的单词CaterpillarFord

ABC123 08-10 Caterpillar

但不是这样:

ABC123 fits 08-10 Caterpillar

或者这个:

ABC123 for 08-10 Caterpillar XYZ789

ABC123XYZ789可以变化并且包含任何内容。

我正在尝试使用Caterpillarfits Caterpillar替换为gsub,但是我不想在已经包含fits或{的字符串上使用{1}}。捕获非常重要,因此我可以弄清楚如何进行for

我写了这个:

gsub

但是上面的正则表达式匹配我的所有三个示例字符串。所以我的否定词是不正确的。并且年份范围必须是可选的。我想将其放在方括号中,但我认为我做的不对,我认为这是一个范围。

2 个答案:

答案 0 :(得分:2)

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

(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S)

注意:\b是必需的。

,并输入替换字符串:

\1fits \2

请参见live demo here

Ruby代码:

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]并不表示fits,而是表示一个既不是f也不是{{ 1}},it。您需要环顾一下(向前/向后看)来表示否定字符串

我使用后向搜索方式说了这样的话,并使用了否定的前瞻性来检查在sCaterpillar之后是否没有非空格字符。

答案 1 :(得分:0)

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

看到我使用负超前行(?!)排除了具有字符串“ fits”的行

^(((?!fits).)*((\d{2}-\d{2}\s)Caterpillar))$

您可以测试此正则表达式here