Perl中的正则表达式排除模式但包含模式

时间:2017-09-14 05:55:50

标签: regex perl

我希望有一个正则表达式模式来匹配一行:
1.此行必须包含“s200”字样 2.字符串的结尾不能是“sping”,“js”,“json”,“css”

这是我得到的怪物,不起作用

(?=^.*$(?<!sping)(?<!js)(?<!css)(?<!json))(?=s200)

我是正则表达式的新手,任何帮助都会受到重视!

2 个答案:

答案 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/
  • 的s200
  • 检查字符串是否以sping,js,json或json结尾/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
    }
}