我正在尝试编写一个匹配包含某个子字符串的字符串的正则表达式,但如果它还包含不同的子字符串则会失败。我找到了this answer,但我不确定如何让它满足我的需求。为了尽可能具体:
为了了解我正在尝试做什么,我有一组我想要过滤的网址。我希望匹配其中包含“/ somedir”的网址,但如果网址中也包含“somestring”,我不希望它匹配。
所以,
会全部匹配,但是,
都会失败。
答案 0 :(得分:0)
如果没有其他模式包围,您需要一个只接受某个模式 的正则表达式:
~
(?(DEFINE)
(?<ACCEPT> must-contain-pattern)
(?<REFUSE> must-not-contain-pattern)
)
^
(?:(?!(?&REFUSE)).)*
(?&ACCEPT)
(?:(?!(?&REFUSE)).)*
$
~ux
在DEFINE
块中根据您的需要定义ACCEPT
和REFUSE
模式,这应该可行。
编辑:通过定义两个命名的子模式,为您的案例量身定制的模式:
~
(?(DEFINE)
(?<ACCEPT> \Q/somedir\E)
(?<REFUSE> \Qsomestring\E)
)
^
(?:(?!(?&REFUSE)).)*
(?&ACCEPT)
(?:(?!(?&REFUSE)).)*
$
~ux