将正则表达式移植到不支持条件引用的限制性更强的正则表达式实现

时间:2014-07-31 16:24:23

标签: java regex

我对another question I asked的答案不适用于Java,因为它不支持条件参考功能。

由于答案在正则表达式的一般意义上是正确的,我想得到一个更具体的问题,即如何在没有条件参考特征的情况下做同样的事情。

My requirement is to ensure that the pattern in the second matching group is the same pattern in the first matching group. But the the conditional reference in this isn't supported in the Java implementation.

(?i)^(?:(\[a-z\]+)|\d+)-(?(1)\[a-z\]+|\d+)$

我已经进行了广泛的搜索,并尝试修改它以在Java中以相同的方式工作但没有成功。

如何将此转换为具有相同输出但具有Java正则表达式限制的内容?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您需要确保xx-yy属于同一类别(字母,数字)。如果他们在第1组中放置xx,在第2组放置yy

如果确实如此,那么您可以使用look-ahead来测试字符串是否为您要接受的形式,然后将每个部分放在不同的组中。

这应该做你想要的:

(?i)^(?=[a-z]+-[a-z]+$|\d+-\d+$)([a-z\d]+)-([a-z\d]+)$

DEMO

简短说明

  • ^(?=[a-z]+-[a-z]+$|\d+-\d+$)这个前瞻测试是否整个字符串都在形式中
    • alpha-alpha
    • numeric-numeric
  • ([a-z\d]+)-([a-z\d]+)$如果以前通过预测执行的是肯定的,我们可以放置匹配的字符(无论它们是a-z还是\d - 这是之前测试过的)到第1组和第1组2。