正则表达式 - 按特定顺序匹配字符串

时间:2017-09-08 03:41:44

标签: regex

我需要一个正则表达式,它将按特定顺序匹配多个字符串,这些字符串由包括换行符在内的任何内容分隔。

因此,如果3个字符串为cat<dog</bird>则为:

cat abcd abc <dog abc </bird>

匹配,但

cat abcd abc </bird> abc <dog

没有。

编辑:还有一个例子:

catabcd abc <dog abc </bird>

以及搜索字词未被字边界分隔的任何此类变体也应匹配。

最后一个例子,它应该是贪婪的:

cat abcd
</bird>
<dog
<dog
cat
</bird>

不匹配。

我试过前瞻: (?=.*?cat)(?=.*?dog)(?=.*?bird).*但这不会强制执行顺序(此特定示例仅适用于一行)。

注意:我使用的是notepad ++,但如果需要可以使用perl。

3 个答案:

答案 0 :(得分:1)

  

可以在必要时使用perl

以下是使用Perl的方法。

  

由包括换行符在内的任何内容分隔

在Perl中,使用s的修饰符.匹配任何内容,包括换行符(此修饰符表示匹配为单行)。

因此,您可以通过以下方式匹配输入:m/.*cat.*dog.*bird.*/s

这是源代码,其输出为matches

#!/bin/perl -W

$content = " cat abcd
abc dog abc
bird";

print "matches\n" if ($content =~ m/.*cat.*dog.*bird.*/s);

答案 1 :(得分:1)

我不确定你在哪里找到了前瞻,因为它们通常比正则表达式中的基本功能更难理解......根据你提供的信息,我会将它用于你的任务:

\bcat\b.*?\bdog\b.*?\bbird\b

Screenshot

确保'正则表达'和'。匹配换行符'都被选中,并且你的光标位于文件的开头。

我使用的\b是为了确保您声明的字词匹配。他们确保单词不在前面,也不在后面加上另一个单词字符(以便cat匹配,但cats不会。)

答案 2 :(得分:1)

你可能需要这样的东西:

cat(?:(?!bird|cat).)*dog(?:(?!dog|bird).)*bird

它只匹配一个cat,之后只有一个dog,然后只有一个bird

借助负面预测断言