最近我在https://regex101.com/上编写/测试regexp。
我的问题是:是否有可能在同样的“替代”中做出积极的展望和替换?或者只是有限的替换是可能的。
输入是几行电话号码。假设“数字”的数量是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
答案 0 :(得分:1)
您无法使用正则表达式替换/删除文本。正则表达式只是一个匹配某些字符串然后根据匹配文本采取某些操作的工具,例如。执行替换,检索第二个捕获组。
但是,可以使用条件在正则表达式引擎中执行某些决策。具有先行断言的通用语法是(?(?=regex)then|else)
。
使用条件,您可以根据文本与正则表达式的匹配方式更改行为。对于您的示例,您可以执行以下操作:
^(\+)?(?(1)\(|\d)
如果电话号码以加号开头,则必须后跟括号,否则它应以数字开头。虽然在你的情况下,这不是很有用。
如果您想在正则表达式中阅读有关条件的更多信息,可以here进行阅读。