Regex 带有两个主组的正则表达式。一个主组中的两个子组。同一组级别的订单不计算在内

Regex 带有两个主组的正则表达式。一个主组中的两个子组。同一组级别的订单不计算在内,regex,set,Regex,Set,我试着写一个正则表达式,如下所示。(我使用自定义符号) {x | x | m | m | t | t | a | i | W | W},{J |},{integer+} 其中: |表示异或 {}花括号表示它是一个集合:顺序不重要 字母区分大小写 问题:如何编写这样的正则表达式? 让我试着通过分析定制符号来解释我想要实现的目标: 逐条分析查询 {x | x | m | m | t | t | a | i | W | W}表示正则表达式应该在 {J |}意味着正则表达式应该检测集合中的一个且仅

我试着写一个正则表达式,如下所示。(我使用自定义符号)

{x | x | m | m | t | t | a | i | W | W},{J |},{integer+}
其中:

  • |
    表示异或
  • {}
    花括号表示它是一个集合:顺序不重要
  • 字母区分大小写
问题:如何编写这样的正则表达式?

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

逐条分析查询

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

{J |}
意味着正则表达式应该检测集合中的一个且仅一个元素

{x | x | m | m | t | t | a | i | W | W}
意味着例如正则表达式应该检测以下内容

  • xJ
  • Jx
    [因为在大屏幕中,两个子集之间的顺序并不重要
  • M
{x | x | m | m | t | t | a | i | W | W}
意味着例如正则表达式应该不检测以下内容

  • xJaslk
  • xX
    [因为正则表达式必须在每个集合中仅检测且仅检测1个元素]
{integer+}
表示大于0的任何整数[即,从1开始到无穷大]。例如,应检测3或342或333。但是不应检测2.0或3,4。理想情况下,1.0或1,0应等于1,但如果不可能,我们跳过它,因为我认为正则表达式已经很复杂

以整个形式分析查询

所以如果我把{code>{x | x | m | m | t | t | a | I | W | W},{J |}{integer+}放在一起,这里是一些法律例子

  • W33
  • Jx848
  • 848a
  • 848Jx
  • 848xJ
  • xJ848
  • Jx848
下面的例子是非法的例子

  • 848.34Ja
  • W33,33
  • 848a848
  • W33W
  • x848J
PS:以防万一,我尝试在Java中使用正则表达式


问题:如何编写这样一个正则表达式?我的直觉是,你不应该尝试编写一个大正则表达式,尽管这是可能的。你的三个部分分为:

  • 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?)([1-9]\d*)?

(请注意,
(J?
相当于
J?
)然后您可以
将所有这些放在一起:
()
,但它很容易出错。我会迭代组的排列,插入到字符串中,并单独测试每个案例。

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

(?|([XmMtTaiWw])|(Jx|xJ)|([1-9][0-9]*))+(?!\1)
到目前为止还不错,但是它需要
848a848
W33W
。我没有用简单的方法忽略重复的组。事实上,在我看来,正则表达式已经太复杂了


你可以在这里试试:

你的初始表达式结尾不需要一个
{integer+}
吗?它不出现在
{}
@ScottHunter中是的,它结尾需要一个{integer+}。这是什么意思[如果有更合适的符号,我可能会更新该符号…只要告诉我您是否有建议]如果最后需要
{integer+}
,则
848Jx
不是法律示例。
(?|([XmMtTaiWw])|(Jx|xJ)|([1-9][0-9]*))+(?!\1)