正则表达式有两个主要组。两个分组在一个主要组中。同一组级别订单不计算在哪里
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式有两个主要组。两个分组在一个主要组中。同一组级别订单不计算在哪里相关的知识,希望对你有一定的参考价值。
我试着写一个应该如下的正则表达式。 (我使用自定义表示法)
{{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中使用该正则表达式。
问题:如何编写这样的正则表达式?
我的直觉是你不应该试着写一个大的正则表达式,尽管它是可能的。你的三件作品分解为:
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>)
,但它会容易出错。我将遍历组的排列,插入字符串并单独测试每个案例。
此时我创建了以下正则表达式:
(?|([XmMtTaiWw])|(Jx|xJ)|([1-9][0-9]*))+(?!\1)
到目前为止这么好,但它需要848a848
和W33W
。我没有设法以一种简单的方式忽略重复组。事实上,我认为正则表达式已经太复杂了。
你可以在这里试试:Clic here to go to Regex101.com
以上是关于正则表达式有两个主要组。两个分组在一个主要组中。同一组级别订单不计算在哪里的主要内容,如果未能解决你的问题,请参考以下文章