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

问题描述 投票:-1回答:2

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

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

哪里:

  • |意味着异或
  • {}花括号意味着它是一个集合:顺序没有重要性
  • 信件具有案例敏感性

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

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

逐件分析查询

{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 [因为顺序在大的两个子集之间无关紧要。
  • 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中使用该正则表达式。

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

regex set
2个回答
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>),但它会容易出错。我将遍历组的排列,插入字符串并单独测试每个案例。


0
投票

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

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

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

你可以在这里试试:Clic here to go to Regex101.com

© www.soinside.com 2019 - 2024. All rights reserved.