我试着写一个应该如下的正则表达式。 (我使用自定义表示法)
{{x|X|m|M|t|T|a|i|W|w}, {J|<null>}}, {integer+}
其中:
|
表示XOR {}
花括号表示它是一个集合:顺序没有重要性问题:如何编写这样的正则表达式?
让我试着通过分析自定义符号来解释我想要实现的目标:
逐件分析查询
{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中使用该正则表达式。
问题:如何编写这样的正则表达式?
答案 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)
到目前为止一切顺利,但需要848a848
和W33W
。我没有设法以简单的方式忽略重复组。事实上,我认为正则表达式已经太复杂了。
您可以在此处试用:Clic here to go to Regex101.com