基本上,我需要\k
和\g
的组合。
以下是一个例子:
我有"123045 ; 67089"
形式的字符串。只有当数字末尾的相同位置的两个数字中都有重复数字时,我才必须匹配。在这种情况下,0
中的123045
距离数字末尾的两个位置与0
中的67089
一样。
问题在于,如果我使用反向引用,则数字的整个余数必须匹配(aka 45
与89
):
^\d*(\d)(\d*) ; \d*\1\2$
如果我使用模式重新执行,我必须提供剩余的特定字符数(在这种情况下为两个):
^\d*(\d)(\d{2}) ; \d*\1\g<2>$
是的,它必须在一个正则表达式中。
答案 0 :(得分:3)
你在这里遇到的是一个平衡问题。您可以使用递归来解决它,我的方法是:
^\d*(\d)(?:(\d(?:(\s*;\s*\d*\1)|\g<2>)\d)|\g<3>)$
这将\s*;\s*\d*\1
作为两个平衡数字组之间的内容。要退出递归,此内容必须完全匹配一次(以避免匹配122
或12;1;13
)。作为替换的内容的递归是针对双位数是每个数字的最后一位的情况。
您可以找到一些测试用例here