我想要一个匹配两位数年份范围的正则表达式和卡特彼勒或福特这样的字样:
ABC123 08-10卡特彼勒但不是这个:
ABC123适合08-10卡特彼勒或这个:
ABC123为08-10 ……
下面的正则表达式符合您的要求,但您将完成替换部分
看到我使用了否定前瞻(?!)来排除字符串“适合”的行
^(((?!fits).)*((\d{2}-\d{2}\s)Caterpillar))$
你可以测试这个正则表达式 这里
我将通过一些修改将我的评论转换成答案。使用以下正则表达式查找匹配项:
(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S)
注意: \b 有必要的。
\b
并为替换字符串:
\1fits \2
看到 现场演示
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 , i , t ,也不是 s 。你需要一个环顾(lookahead / lookbehind)来表达 的 否定字符串 强> 。
[^fits]
fits
f
i
t
s
我使用lookbehind来说明这一点和一个消极的前瞻,以检查是否有非空格字符 Caterpillar 要么 Ford 。
Caterpillar
Ford