正则表达式有两个主要组。两个分组在一个主要组中。同一组级订单不计算

时间:2018-05-15 21:33:38

标签: regex set

我试着写一个应该如下的正则表达式。 (我使用自定义表示法)

{{x|X|m|M|t|T|a|i|W|w}, {J|<null>}}, {integer+}

其中:

  • |表示XOR
  • {}花括号表示它是一个集合:顺序没有重要性
  • 字母为CASE-SENSITIVE

问题:如何编写这样的正则表达式?

让我试着通过分析自定义符号来解释我想要实现的目标:

逐件分析查询

{x|X|m|M|t|T|a|i|W|w}表示正则表达式应该在

中检测到一个且只有一个字符

{J|<null>}表示正则表达式应该检测集合中的一个元素和一个元素。

{{x|X|m|M|t|T|a|i|W|w},{J|<null>}}表示例如,正则表达式应检测以下内容

  • xJ
  • Jx [因为订单在big。中的两个子集之间无关紧要。
  • M<null>

{{x|X|m|M|t|T|a|i|W|w},{J|<null>}}表示例如,正则表达式检测以下内容

  • xJaslk
  • xX [因为正则表达式必须只检测每个集合中只有1个元素]

{integer+}表示任何大于0的INTEGER [即从1开始到无限]。例如,应该检测到3或342或333。但是不应该检测到2.0或3,4。理想情况下1.0或1,0应该等于1,但如果不可能,请跳过这一点,因为我认为正则表达式已经很复杂了。

以整个形式分析查询

所以如果我把{{x|X|m|M|t|T|a|i|W|w}, {J|<null>}}, {integer+}放在一起这里有一些合法的例子

  • W33
  • Jx848
  • 848a
  • 848Jx
  • 848xJ
  • xJ848
  • Jx848

以下示例为非法示例

  • 848.34Ja
  • W33,33
  • 848a848
  • W33W
  • x848J

PS:以防万一,我尝试在Java中使用该正则表达式。

问题:如何编写这样的正则表达式?

2 个答案:

答案 0 :(得分:0)

我的直觉是你不应该试着写一个大的正则表达式,尽管它是可能的。你的三件事分解为:

  • x|X|m|M|t|T|a|i|W|w
  • J?
  • [1-9]\d*

并且您希望以任何顺序选择性地匹配它们。在这种情况下,有6种可能的排列:

  • (x|X|m|M|t|T|a|i|W|w)?(J?)?([1-9]\d*)?
  • (J?)?(x|X|m|M|t|T|a|i|W|w)?([1-9]\d*)?

(请注意(J?)?相当于J?。)然后,您可以or将所有这些组合在一起:(<first case>)|(<second case>)|...|(<sixth case>),但这样会容易出错。我将遍历组的排列,插入到一个字符串中并单独测试每个案例。

答案 1 :(得分:0)

此时我创建了以下正则表达式:

(?|([XmMtTaiWw])|(Jx|xJ)|([1-9][0-9]*))+(?!\1)

到目前为止一切顺利,但需要848a848W33W。我没有设法以简单的方式忽略重复组。事实上,我认为正则表达式已经太复杂了。

您可以在此处试用:Clic here to go to Regex101.com