正则表达式匹配包含子字符串,但不包括子字符串的字符串
问题描述:
我想写一个匹配包含特定子字符串的字符串的正则表达式,但如果它也包含不同的子字符串,则会失败。我找到了this answer,但我不确定如何让它满足我的需求。为了尽可能具体:正则表达式匹配包含子字符串,但不包括子字符串的字符串
- 是的,它必须做到这一点作为表达的一部分。我无法访问将要处理的代码。
- 是的,它需要是一个表达式。
- 它需要使用PHP的正则表达式。我很确定它正在使用preg进行评估
为了说明我正在尝试做什么,我有一组我想要过滤的URL。我想匹配其中包含“/ somedir”的网址,但如果网址中还包含“somestring”,我不希望它匹配。
所以,
- www.somesite.com/somedir/index.html
- www.somesite.com/somedir/somotherdir/index.html
- www.somesite.com/somedir/ somepage.html
都会匹配,但是,
- www.somesite。 COM/somedir/somestring.html
- www.somesite.com/somedir/somestring/index.html
会都失败。
答
你需要一个正则表达式,将接受某种模式只有如果它没有被其他模式所包围:
~
(?(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
为什么正则表达式? “strpos”的简单组合将起作用。 – Tchoupi 2013-03-07 17:37:39
*“我很确定它正在使用preg进行评估”* - 在询问之前您应该知道,因为它不同(很可能您是对的,但是,很好,找出;)) - 也是使用模式的代码是必要的,因为它可以区分使用正则表达式的方式。你也应该概述你到目前为止所尝试的。例如。模拟你自己的代码,提供数据运行,输出结果,使模式变成一个变量,然后尝试。 – hakre 2013-03-07 17:39:37
http://stackoverflow.com/questions/2953039/regular-expression-for-a-string-containing-one-word-but-not-another – Crisp 2013-03-07 17:41:49