2017-11-04 68 views
1

我有一个文件,我希望使用正则表达式在关键字之间匹配某个单词。例如,假设我想在关键字“开始”之后和关键字“结束”之前匹配单词“狗”的每次出现。在正则表达式中查找两个单词之间的词

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 

也许正则表达式有一个管的功能,使我能得到这个词“开始”字之前的“结束”后的文本,然后通过管道到一个新的正则表达式?然后,我可以在第二个正则表达式中搜索“狗”。我对正则表达式很陌生,一直在努力想出一个解决方案。谢谢

+0

你不能,基本上因为看后面必须是固定长度。 – Bohemian

回答

3

当你匹配“全局”(即收集多个匹配是不连续的),你提供一个规定诸如“比赛都必须在容器中存在“(在这种情况下,间‘开始’和‘结束’),这通常要求的构建体如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匹配一个完整的组,然后检查其所有出现的“狗”的内容。

+0

哇,这是一个非常聪明和有趣的解决方案。感谢您的详细解释! – Michael

+0

哈哈谢谢,并乐意帮忙!它基本上是标准的“x”和“y”解决方案之间的匹配,但如果我们知道有关输入的某些内容,我们可以更加聪明。例如,如果我们知道“结束”将不会出现,并且没有“开始”就不会存在,那么我们可以简单地向前看,看看是否有“结束”,例如:'狗(?= ?:(?!开头)。)*?结束)'这是更简单,更普遍支持:) – jaytea

+0

很高兴知道,似乎它可以非常有用的查找特定值之间的HTML标签。 – Michael

-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); 
} 
+0

我的观点是:如果您可以用某种语言提出解决方案,人们可​​能会更好地提供帮助。 – Bing

+0

无论谁评论,删除他们的评论和downvoted ...解释会有所帮助。 – Bing

0

更新:

开始(狗)+年底

测试下面的链接,在这里(?)(?)是一个屏幕:

enter image description here

以前: (请注意,这可能不完全回答你因为它很大程度上取决于你工作的语言)

Ref。 1 link Ref。 2 link

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

此外可以使用此调试https://regex101.com/

+0

我无法使用regex101中的正则表达式来突出显示单词。我需要这个在bash脚本中工作,所以我相信任何标准的正则表达式都可以工作,如果有帮助的话。我的任务需要一个正则表达式语句,而不使用任何其他的bash命令或工具 – Michael

+0

我看到...好吧,我会尝试查找并完全匹配并在此处回复。感谢您的反馈 – oetoni

+0

非常感谢。我会检查出你链接的那些文章 – Michael

相关问题