在正则表达式中查找两个单词之间的单词

时间:2017-11-04 03:08:47

标签: regex

我有一个文件,我希望使用正则表达式匹配关键字之间的某个单词。例如,假设我想匹配单词" dog"的每一个匹配项。在关键字" start"之后关键字"结束"。

之前
dog horse animal cat dog // <-- don't match 
random text dog   // <-- don't match
start 

brown dog
black dog
cat horse animals

end 
dog cat // <-- don't match
good dog    // <-- don't match

也许正则表达式有一个管道功能,我可以在单词&#34; start&#34;之后得到文本。在单词&#34; end&#34;之前,然后将它输入一个新的正则表达式?然后我就可以搜索&#34; dog&#34;在第二个正则表达式中。我是正则表达式的新手,并且一直在努力想出一个解决方案。谢谢

3 个答案:

答案 0 :(得分:4)

当您匹配“全局”(即收集几个不连续的匹配)并且您提供诸如“匹配必须全部存在于容器中”的规定时(在这种情况下,在“开始”和“结束之间) “),这通常需要一个构造,如PCRE的'\ G',它只在第一个尝试位置匹配:

(?:\G(?!\A)|start)(?:(?!end).)*?\Kdog

请参阅:https://regex101.com/r/uV7EjE/1

重要的是要注意,这使用了一些不受普遍支持的构造,以及一个特定于PCRE('\ K')的构造。每个部分的解释:

/(?:
\G(?!\A)        # Match only at the first position, since the usual behaviour of regex is to attempt to match at each position. In effect, this ensures we only match immediately after the last valid "dog".
|start          # Or match "start".
)
(?:(?!end).)*?  # Match as few characters as possible, making sure we don't encounter "end".
\K              # Reset the consumption counter so everything before this isn't matched.
dog             # Match what we want.
/gmsx

如果您需要更广泛支持更基本的正则表达式引擎,那么您确实需要管道一个更简单的表达式,例如start.*?end来匹配一个完整的组,然后检查其内容是否出现所有“狗”。

答案 1 :(得分:0)

更新

开始(?)(狗)+(。?)端

在以下链接上测试,这是一个屏幕:

enter image description here

前面的: (请注意,这可能无法完全回答您的情况,因为它在很大程度上取决于您使用的语言)

参考。 1 link 参考。 2 link

它还取决于您正在开发的语言,正如其他评论所说的那样。如果你能让我知道你在哪里发展,我可能会给你一个更好的答案。

您也可以使用它来调试https://regex101.com/

答案 2 :(得分:-1)

我知道你要求正则表达式,但如果你使用的是某种语言,可能会有更合适的解决方案。例如,在PHP中,这个函数可以工作:

function getStringBetween($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}