如何创建正则表达式模式以匹配有序的子串序列?

时间:2015-10-08 04:19:01

标签: regex string validation

我有一个多行文本,我试图验证在预期的顺序中有一组特定的子串。例如:

orange: VGHM00112900837-00692
   banana: LAPM00112900837-00692_1
      apple: CAPM00112900837-00692

我需要验证文本以" orange"开头,然后是" banana",然后有" apple"。这些子串之间的字符无关紧要,但它们必须按橙色,香蕉,苹果的顺序排列。最重要的是,每个子字符串只能在此序列中出现一次。

我一直坐在这里,在一个在线的Regex测试仪上调整了几个小时,我的cro-magnon大脑太密集了,无法弄明白。我能得到的最接近的是......

^(?s)orange(.*)banana(.*)apple(.*)$

...但是这样可以在字符串中重复。我已经尝试了很多来自stackoverflow的不同建议,但由于某些原因我无法做到正确。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

\borange\b(?:(?!\b(?:banana|apple|orange)\b)[\s\S])*?\bbanana\b(?:(?!\b(?:orange|apple|banana)\b)[\s\S])*?\bapple\b(?:(?!\b(?:orange|apple|banana)\b)[\s\S])*

您可以使用lookahead构建正则表达式,以确保每个字符串只出现一次。请参阅演示。

https://regex101.com/r/cJ6zQ3/31