3

我需要塑造一个具有以下要求的正则表达式:

给定示例文本:

SEARCH_TERM_#1 find this text SEARCH-TERM_#2_more text_SEARCH-TERM_#3
SEARCH_TERM_#1 find this text SEARCH-TERM_#3

我想提取出现在该find this text区域的字符串

SEARCH_TERM_#1正则表达式应该在upto之后收集数据,但不包括SEARCH_TERM_#2SEARCH-TERM_#3哪个先出现。无论在#2 和#3 中找到什么,它都应该选择作为“右侧”搜索边界。

我试过(?>SEARCH_TERM_#2|SEARCH_TERM_#3) (?=(?>SEARCH_TERM_#2|SEARCH_TERM_#3))(?>(?=SEARCH_TERM_#2)|(?=SEARCH_TERM_#3))。他们都将第二个搜索词包含在收集的数据中,并在第三个之前停止,而我希望收集的数据在 #2 或 #3 之前停止,哪个先出现。

4

2 回答 2

6

描述

这个正则表达式将:

  • 找到第一个SEARCH_TERM_#1
  • 从之后开始捕获文本SEARCH_TERM_#1
  • 当遇到SEARCH_TERM_#2SEARCH_TERM_#3(哪个是第一个)时停止捕获文本

^.*?SEARCH_TERM_\#1((?:(?!SEARCH-TERM_\#2|SEARCH-TERM_\#3).)*)

在此处输入图像描述

展开

  • ^匹配字符串的开头,这会强制搜索从开头开始
  • .*?匹配所有字符直到下一个表达式。请注意,该术语应与s允许点匹配换行符的选项结合使用
  • SEARCH_TERM_\#1第一个搜索词
  • (启动捕获组 这组括号将匹配的值放入捕获组 1
  • (?:启动非捕获组,这是真正的魔力,并且基本上允许包含的表达式继续匹配,直到它偶然发现SEARCH-TERM_\#2SEARCH-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 解析工具而不是正则表达式进行调查。

于 2013-06-23T05:01:52.163 回答
1

这种模式效果很好:

SEARCH_TERM_#1(.*?)SEARCH-TERM_#2_OR_#3

您感兴趣的内容在第一个捕获组中,请参阅您的语言或软件文档以了解如何引用捕获组内容。

如果支持,您可以使用环视:

(?<=SEARCH_TERM_#1).*?(?=SEARCH-TERM_#2_OR_#3)

然后结果就是整个模式。

请注意,我使用惰性量词*?而不是贪婪量词*。更多信息在这里

于 2013-06-22T16:59:46.417 回答