【问题标题】:positive look ahead and replace积极展望并替换
【发布时间】: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 行中的其他事物结合。
  • 你应该已经发布了你的代码,这样会更容易遵循逻辑。

标签: regex lookahead


【解决方案1】:

您不能用正则表达式替换/删除文本。正则表达式只是匹配某些字符串然后根据匹配文本采取某些操作的工具,例如。执行替换,检索第二个捕获组。

但是,通过使用条件,可以在正则表达式引擎中执行某些决定。带有前瞻断言的常用语法是(?(?=regex)then|else)

使用条件,您可以根据文本与正则表达式的匹配程度来更改行为。对于您的示例,您可以执行以下操作:

^(\+)?(?(1)\(|\d)
如果电话号码以加号开头,则必须后跟括号,否则应以数字开头。尽管在您的情况下,这不是很有用。

如果您想详细了解正则表达式中的条件,可以这样做here

【讨论】:

  • 如果我对 (linux/unix) "grep" 使用正则表达式,它将无法替换,只能匹配或不匹配,但是如果我在 (linux/unix) sed 中使用,那么我可以替换,而我可以使用正则表达式。在一些简单的情况下检查 + 替换:regex101.com/r/yJ3aY4/1 或一些 perl 1 衬里:echo -e "There are many kind of fruit wine.\napple wine"|perl -pe 's/(?regex101.com/r/zR8sQ6/2
  • 编辑:这:regex101.com/r/zR8sQ6/2 根本不起作用,它甚至匹配错误的行。
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多