我怎样才能让这个正则表达式匹配失败?
How can I get this regex match to fail?
我想要一个匹配两位数年份范围和单词 Caterpillar
或 Ford
的正则表达式,如下所示:
ABC123 08-10 Caterpillar
但不是这个:
ABC123 fits 08-10 Caterpillar
或者这个:
ABC123 for 08-10 Caterpillar XYZ789
ABC123
和 XYZ789
可以变化并包含任何内容。
我正在尝试使用 gsub
将单词 Caterpillar
替换为 fits Caterpillar
,但我不想在已经包含 fits
的字符串上执行此操作或 for
。捕获很重要,这样我才能弄清楚如何执行 gsub
.
我写了这个:
/([^fits]\s?\d{2}-\d{2}\s*(Ford|Caterpillar))/
但是上面的正则表达式匹配我的所有三个示例字符串。所以我的否定这个词是不正确的。年份范围必须是可选的。我想把它放在方括号中,但我认为我这样做不对,我认为那是表示一个范围。
下面的正则表达式满足您的要求,但您需要完成替换部分
看到我使用了 Negative Lookahead (?!) 来排除具有字符串 "fits"
的行
^(((?!fits).)*((\d{2}-\d{2}\s)Caterpillar))$
你可以测试这个正则表达式 here
我将通过一些修改将我的评论转换为答案。使用以下正则表达式查找匹配项:
(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S)
注:\b
是必须的。
对于替换字符串:
fits
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
,而是表示 一个既不是 [=16] 的字符 =]、i
、t
或 s
。您需要环视(lookahead / lookbehind)来表达字符串的否定。
我使用 lookbehind 和否定前瞻来检查非 space 字符是否没有出现在 Caterpillar
或 Ford
.
之后
我想要一个匹配两位数年份范围和单词 Caterpillar
或 Ford
的正则表达式,如下所示:
ABC123 08-10 Caterpillar
但不是这个:
ABC123 fits 08-10 Caterpillar
或者这个:
ABC123 for 08-10 Caterpillar XYZ789
ABC123
和 XYZ789
可以变化并包含任何内容。
我正在尝试使用 gsub
将单词 Caterpillar
替换为 fits Caterpillar
,但我不想在已经包含 fits
的字符串上执行此操作或 for
。捕获很重要,这样我才能弄清楚如何执行 gsub
.
我写了这个:
/([^fits]\s?\d{2}-\d{2}\s*(Ford|Caterpillar))/
但是上面的正则表达式匹配我的所有三个示例字符串。所以我的否定这个词是不正确的。年份范围必须是可选的。我想把它放在方括号中,但我认为我这样做不对,我认为那是表示一个范围。
下面的正则表达式满足您的要求,但您需要完成替换部分
看到我使用了 Negative Lookahead (?!) 来排除具有字符串 "fits"
的行^(((?!fits).)*((\d{2}-\d{2}\s)Caterpillar))$
你可以测试这个正则表达式 here
我将通过一些修改将我的评论转换为答案。使用以下正则表达式查找匹配项:
(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S)
注:\b
是必须的。
对于替换字符串:
fits
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
,而是表示 一个既不是 [=16] 的字符 =]、i
、t
或 s
。您需要环视(lookahead / lookbehind)来表达字符串的否定。
我使用 lookbehind 和否定前瞻来检查非 space 字符是否没有出现在 Caterpillar
或 Ford
.