我希望有一个正则表达式模式来匹配一行:
1.此行必须包含“s200”字样
2.字符串的结尾不能是“sping”,“js”,“json”,“css”
这是我得到的怪物,不起作用
(?=^.*$(?<!sping)(?<!js)(?<!css)(?<!json))(?=s200)
我是正则表达式的新手,任何帮助都会受到重视!
答案 0 :(得分:1)
对于初学者来说,你的正则表达式与任何东西都不匹配,因为你的正则表达式中只有你的外观。
?= # look ahead for match
?<! # negative look behind
换句话说,你没有匹配任何东西,你的正则表达式你正在寻找字符串中的position
。
说明:
(?= # pos. lookahead
^.*$ # read anything
# and AFTER reading everything, check
(?<!sping) # if you have NOT read sping
(?<!js) # if you have NOT read js
(?<!css) # if you have NOT read css
(?<!json) # if you have NOT read json
)
(?=s200) # from this position, check if there's "s200" ahead.
结论:你的正则表达式永远不会符合你的要求。
你可以用一个正则表达式解决这个问题,例如:
(.*)s200(.*)$(?<!css|js|json|sping)
说
.* # read anything
s200 # read s200
.* # read anything
$ # match the end of the string
(?<!css|js|json|sping) # negative lookbehind:
# if you have read css,js,json or sping, fail
你可以分两步完成这个任务:
/s200/
/css|js(on)?|sping$/
答案 1 :(得分:1)
您已将其标记为perl
,因此这是一个perl
解决方案:
$_ = $stringToTest;
if (/s200/) {
# We now know that the string contains "s200"
if (/sping|json|js|css$/) {
# We now know it end with one of sping,json,js or css
}
}