我可以编写一个检查两个长度相等的正则表达式吗?

时间:2016-04-21 15:18:39

标签: regex

我希望匹配两个长度相等的字符串,例如:42-420-212345-54321

我不想匹配两个数字长度不同的字符串,例如:42-1000-0000

这两部分(用连字符分隔)必须具有相同的长度。

我想知道是否可以使用[0-9]{n}-[0-9]{n}变量进行n这样的正则表达式但是相等?

如果在一个模式中没有干净的方法(我必须将它放在HTML表单输入的模式属性中),我将执行类似/\d-\d|\d{2}-\d{2}|\d{3}-\d{3}|<etc>/的操作,最大长度(在我的情况下为16) )。

2 个答案:

答案 0 :(得分:1)

这对于正则表达式是不可能的,因为这既不是类型3语法(可以使用正则表达式)也不是类型2语法(可以使用支持递归的正则表达式完成)。

较高的语法级别(1型语法和0型语法)只能使用图灵机(或与您的编程语言兼容的东西)进行解析。

有关此内容的更多信息,请访问: https://en.wikipedia.org/wiki/Chomsky_hierarchy#The_hierarchy

使用编程语言,您需要计算第一个数字序列,检查减号,然后检查是否跟随相同数量的数字。 没有减号,这将是一个2型语法,可以使用递归正则表达式解决(即使正确的序列不包含数字),如下所示:^(\ d(?1)\ d)$ < / p>

因此,您需要编写自己的非正则表达式检查代码。

答案 1 :(得分:0)

您应该将String拆分为分隔符并比较两个部分的长度。

在指定“与之前相同的东西”时使用的正则表达式中选择的工具是反向引用,但它们引用匹配的值而不是匹配的模式:无法使用对{{1}的反向引用匹配任意3个字符。

但是,如果你只需要验证有限数量的长度,可以(痛苦地)完成交替:

  • .{3}最多可匹配分隔符两侧的1个字符
  • \d-\d将在分隔符的两侧最多匹配2个字符
  • ...