我正在尝试匹配英国银行排序代码(没什么复杂的,只有三对数字,可以用连字符分隔)。我想我可以尝试匹配第一个连字符,然后使用
我正在尝试匹配英国银行排序代码(没什么复杂的,只有三对数字,可以用连字符分隔)。我想我可以尝试匹配第一个连字符,然后使用反向引用来检查我匹配的值是否使用了连字符。
/^\d{2}(-)?\d{2}\1\d{2}$/
应该匹配
12-34-56
123456
但不反对
12-3456
1234-56
这很好,并且运行良好——在 JavaScript 中。
当我使用 PCRE 引擎(例如 PHP)时,正则表达式无法按预期匹配。我使用了不同的正则表达式来避免这种情况,但我仍然想知道发生了什么?
我可以使用一些内部黑魔法来 (*SKIP)(*FAIL)
使用可选的反向引用吗?
JavaScript遵循ECMA标准规范。
根据 ECMA 官方标准,对非参与捕获组的反向引用必须成功匹配不包含任何内容,就像对未捕获任何内容的参与组的反向引用一样。( 来源 )
在这里 /^\d{2}(-)?\d{2}\1\d{2}$/
,我们有一个 可选的 捕获组,可以匹配连字符。JavaScript 正则表达式引擎“消耗”可选组中的空文本,以便以后通过反向引用访问它们。这个问题与 失败组的反向 。例如, ((q)?b\2)
匹配 b
,但在 PCRE 中不匹配。
因此,一种解决方法是使用 带有空替代方案的 强制 演示 ):
^\d{2}(-|)\d{2}\1\d{2}$
^^
另外,您可以将 ?
量词移动到连字符本身( demo ):
^\d{2}(-?)\d{2}\1\d{2}$