正则表达式可按任何顺序匹配逗号分隔的项目列表

时间:2018-07-26 13:34:17

标签: regex

我有三个“提示文字”,内容为:

SomeClue=someText
AnotherClue=somethingElse
YetAnotherClue=moreText

我需要解析一个字符串,看看它是否完全包含这3个文本,并用逗号分隔。没有线索文本包含任何逗号。 问题是,它们可以以任何顺序排列,并且必须是字符串中的唯一线索。

比赛:

SomeClue=someText,AnotherClue=somethingElse,YetAnotherClue=moreText
SomeClue=someText,YetAnotherClue=moreText,AnotherClue=somethingElse
AnotherClue=somethingElse,SomeClue=someText,YetAnotherClue=moreText
YetAnotherClue=moreText,SomeClue=someText,AnotherClue=somethingElse

非比赛:

    SomeClue=someText,AnotherClue=somethingElse,YetAnotherClue=moreText,
    SomeClue=someText,YetAnotherClue=moreText,,AnotherClue=somethingElse
    ,AnotherClue=somethingElse,SomeClue=someText,YetAnotherClue=moreText
    YetAnotherClue=moreText,SomeClue=someText,AnotherClue=somethingElse,UselessText
    YetAnotherClue=moreText,SomeClue=someText,AnotherClue=somethingElse,AClueThatIDontWant=wrongwrongwrong

将togheter放在我在其他帖子中发现的内容上,

(?=.*SomeClue=someText($|,))(?=.*AnotherClue=somethingElse($|,))(?=.*YetAnotherClue=moreText($|,))

就线索及其顺序而言,此方法有效。 不幸的是,我找不到避免在开头加上逗号然后再添加一些愚蠢文本的方法。

我的真实案例中的线索文本有些复杂,因为它们每个都是小的正则表达式,但是我很确定一旦知道如何处理逗号,其余的就很容易了。

1 个答案:

答案 0 :(得分:0)

我认为,使用强大的工具比使用正则表达式会更好(我真的很喜欢正则表达式)。正则表达式不利于需要补充内存,这就是您在这里所需要的:您恰好需要这三个,但是它们可以以任何顺序出现。

原则上,您可以为6个排列的每一个编写一个正则表达式。但这不可能扩展。您应该使用具有解析能力的东西。

我建议用您喜欢的脚本语言编写一个由底层字符串函数组成的验证函数。

在基本的Python中,您可以做到(例如)

ref = set(['SomeClue=someText', 'AnotherClue=somethingElse', 'YetAnotherClue=moreText'])

def ismatch(myline):
  splt = myline.split(',')
  return ref == set(splt)

当然,您可以根据需要进行调整。请注意,这种几乎完整的解决方案并没有比任何正则表达式更长,可读性也更高。