正则表达式分组匹配验证

时间:2013-06-21 14:50:53

标签: regex expression

我想知道是否有某种方式来证明分组是否产生了匹配。例如,让我们看看我想用以下2个字符串完成的任务:

string 1: "start magic someword anotherword test end"

string 2: "start test x y z end"

我想获取包含关键字magictest(两者都有)的字符串。但是有一些问题:

  • magictest可能不会相互连续。例如,start magic word1 test word2 end
  • magictest可能不在字符串中的顺序,即应为start magic test endstart test magic end匹配。

为了解决这个问题,我采用了以下正则表达式:

start ((w1)*(w2)*\[^(end)])+end

......这意味着:

  • 该字符串必须以单词start开头,并以end结束。
  • 以任意顺序匹配w1w2,并使用end消费其他不是[^(end)]的字词。
  • 之后,匹配结束。

正则表达式的问题在于,所有字符串都因[^(end)]而匹配,我需要在实际字符串中放弃w1w2之间的单词。

将正则表达式与字符串1匹配,它将是:

start ((magic)*(test)*[^(end)])+end

...它应该只匹配字符串1(这就是我想要的)。但是字符串2也匹配。

是否有任何形式的检查分组是否已与正则表达式引擎匹配?像(if \1 != null)这样的内容可以检查是否遇到了magictest个关键字?我必须使用正则表达式,因为我无法在源代码中处理它。它旨在使用命令行调用的工具。

2 个答案:

答案 0 :(得分:0)

描述

此表达式将:

  • 要求字符串以start开头,后跟空格
  • 要求字符串以空格结尾,后跟end
  • 必须以任何顺序包含magictest
  • 单词magictest必须至少包含一个空格

^start(?=\s)(?=.*\smagic(?=\s))(?=.*\stest(?=\s)).*\send(\r|\n|\Z)

enter image description here

输入文字

start magic someword anotherword test end
start test x y z end
start the a magic show with Gob and Tony Wonder who will test till the end

**输出

[0] => start magic someword anotherword test end
[1] => start the a magic show with Gob and Tony Wonder who will test till the end

答案 1 :(得分:0)

最后,我删除了作为标记的开始和结束,并将它们替换为**。表达式现在是

"\*\* [^\*]*(w1|w2)[^\*]*(w1|w2)[^\*]* \*\*"

匹配字符串"** whatever w1|w2 whatever w1|w2 whatever **"

并且不匹配"** whatever w1|w2 ** w1|w2 **"

之类的字符串

@Denomales,你能告诉我你从哪里得到这张照片吗?谢谢