描述
这个正则表达式将:
- 找到第一个
SEARCH_TERM_#1
- 从之后开始捕获文本
SEARCH_TERM_#1
- 当遇到
SEARCH_TERM_#2
或SEARCH_TERM_#3
(哪个是第一个)时停止捕获文本
^.*?SEARCH_TERM_\#1((?:(?!SEARCH-TERM_\#2|SEARCH-TERM_\#3).)*)
展开
^
匹配字符串的开头,这会强制搜索从开头开始
.*?
匹配所有字符直到下一个表达式。请注意,该术语应与s
允许点匹配换行符的选项结合使用
SEARCH_TERM_\#1
第一个搜索词
(
启动捕获组 这组括号将匹配的值放入捕获组 1
(?:
启动非捕获组,这是真正的魔力,并且基本上允许包含的表达式继续匹配,直到它偶然发现SEARCH-TERM_\#2
或SEARCH-TERM_\#3
(?!
开始负前瞻。想想正则表达式引擎在输入字符串中移动光标。loohahead 只是查看光标后面的字符而不移动光标。否定表示如果找到的表达式解析为匹配,则拒绝匹配,或者如果未找到表达式,则允许匹配。
SEARCH-TERM_\#2|SEARCH-TERM_\#3
寻找任何一个值。这|
是一个“或”语句
)
关闭负前瞻
.
匹配任何字符。只有在前面的否定前瞻没有找到它的搜索词时,表达式才会到达这个位置
)
关闭非捕获组,此时搜索已停止,因为它遇到了 #2 或 #3 结束条件,或者非捕获组找到了单个字符
*
继续贪婪地匹配所有字符。您可以使用贪婪,因为结束条件包含在表达式中。
)
关闭捕获组
PHP 代码示例
您没有指定语言,所以我包含这个 PHP 示例只是为了展示它是如何工作的。
输入文本
skip this text SEARCH_TERM_#1 find this text SEARCH-TERM_#2 more text to ignore SEARCH_TERM_#3
代码
<?php
$sourcestring="your source string";
preg_match('/^.*?SEARCH_TERM_\#1((?:(?!SEARCH-TERM_\#2|SEARCH-TERM_\#3).)*)/ims',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
火柴
$matches Array:
(
[0] => skip this text SEARCH_TERM_#1 find this text
[1] => find this text
)
现实世界的例子
或者使用评论中包含的真实示例:
正则表达式:^.*?style="background-image: url\(((?:(?!&cfs=1|\)).)*)
输入文本:<a href=http://i.like.kittens.com style="background-image: url(http://I.like.kittens.com?Name=Boots&cfs=1)">
火柴:
[0] => <a href=http://i.like.kittens.com style="background-image: url(http://I.like.kittens.com?Name=Boots
[1] => http://I.like.kittens.com?Name=Boots
免责声明
这模糊地看起来像是使用正则表达式解析 HTML 的常见问题。如果您的输入文本是 HTML,那么您应该使用 HTML 解析工具而不是正则表达式进行调查。