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
[因为正则表达式必须在每个集合中仅检测且仅检测1个元素]xX
{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
问题:如何编写这样一个正则表达式?我的直觉是,你不应该尝试编写一个大正则表达式,尽管这是可能的。你的三个部分分为:
x | x | m | m | t | t | a | i | W | W
J?
[1-9]\d*
(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)