【发布时间】:2015-07-25 17:40:50
【问题描述】:
最近我正在https://regex101.com/ 上编写/测试正则表达式。
我的问题是:是否可以在同一个“替换”中进行积极的前瞻性和替换?或者只是有限的替换是可能的。
输入是几行电话号码。假设正确的电话号码,其中“数字”的个数为 11。无论数字如何用 - / 字符划分/分组,无论是以 + 00 开头还是省略。 一些示例行:
+48301234567
+48/30/1234567
+48-30-12-345-67
+483011223344556677
0048301234567
+(48)30/1234567
正向超前能够检查从开头到结尾是否只有 11 位数字,无论有多少其他数字,以上指定的字符将它们分开。这完美地工作。
如果积极的前瞻检查很好,我想删除除数字之外的每个字符。在我不涉及前瞻之前,替换工作正常。
检查正则表达式本身是否正常工作(“gm”模式):
^(?:\+|00)?(?:[\-\/\(\)]?\d){11}$
检查替换部分是否完美(替换为空):
[^\d\n]
在从匹配行中删除非换行符和非数字字符后,将其放入前瞻中:
(?=^(?:\+|00)?(?:[\-\/\(\)]?\d){11}$)[^\d\n]
即使我将 ^ $ 放入前瞻中,似乎替换只从行的开头到第一个数字起作用。
我知道在现实生活中替换和检查应该/会分开,但是我很好奇我是否可以将前瞻/后视与字符串操作(如替换、删除、将字符串分开并放置)混合在一起随心所欲地在一起。
更新:这就是诀窍,但我觉得这个有点“丑陋”。有没有更漂亮的解决方案? https://regex101.com/r/yT5dA4/2
或者我最初询问的版本,只剩下数字:regex101.com/r/yT5dA4/3
【问题讨论】:
-
你的意思是this regex does not work for these data?您删除了所有非数字,现在尝试匹配它们?你不是在找
^(?:00)?\d{11}$吗? -
我正在尝试使用相同的正则表达式行执行以下两个操作: - 检查当前行(在这种情况下为电话号码)格式是否匹配 - 如果匹配,请执行以下操作:删除所有内容,但数字
-
你不能用一个正则表达式来实现它,它应该匹配它不能匹配的东西,或者只匹配所有东西。使用 2 个正则表达式:1)删除所有非数字,2)检查它是否符合某种模式(就像我在上面的评论中发布的那样)。
-
对不起,我不明白你想告诉什么。如果您复制粘贴我包含的示例数据并检查我包含的每个正则表达式,您可以看到正则表达式工作正常,直到我将前瞻与其他内容混合。混合后,它希望我指定我想要或不想要的字符的确切数量/位置。 “查找任何非数字字符并删除它们”不再起作用。但是,您可能对我的怀疑是正确的:前瞻/后瞻无法真正与 1 行中的其他事物结合。
-
你应该已经发布了你的代码,这样会更容易遵循逻辑。