正则表达式在一个搜索词之后和之前的两个之前收集数据(这是第一个)

a_h*_*nif 3 regex lookahead lookbehind lookaround alternation

我需要按照以下要求制作正则表达式:

给出示例文本:

SEARCH_TERM_#1 find this text SEARCH-TERM_#2_more text_SEARCH-TERM_#3
SEARCH_TERM_#1 find this text SEARCH-TERM_#3
Run Code Online (Sandbox Code Playgroud)

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

正则表达式应该在SEARCH_TERM_#1最多但不包括SEARCH_TERM_#2或者SEARCH-TERM_#3首先出现之后收集数据.它应该选择作为"右侧"搜索边界,无论它首先发现#2和#3.

我试过(?>SEARCH_TERM_#2|SEARCH_TERM_#3) (?=(?>SEARCH_TERM_#2|SEARCH_TERM_#3))(?>(?=SEARCH_TERM_#2)|(?=SEARCH_TERM_#3)).并且它们全部包括第二个搜索项到收集的数据中并在第三个之前停止,而我希望收集的数据在#2或#3之前停止.

Ro *_* Mi 5

描述

这个正则表达式将:

  • 找到第一个 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
Run Code Online (Sandbox Code Playgroud)

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

火柴

$matches Array:
(
    [0] => skip this text SEARCH_TERM_#1 find this text 
    [1] =>  find this text 
)
Run Code Online (Sandbox Code Playgroud)

真实世界的例子

或者使用评论中包含的真实世界示例:

正则表达式: ^.*?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
Run Code Online (Sandbox Code Playgroud)

放弃

这看起来像使用正则表达式解析HTML时常见的问题.如果您的输入文本是HTML,那么您应该使用HTML解析工具而不是正则表达式进行调查.