【问题标题】:Regex positive lookaheads in group to filter out specific character, then backreference filtered group?正则表达式在组中向前看以过滤掉特定字符,然后反向引用过滤组?
【发布时间】:2013-03-28 11:13:31
【问题描述】:

所以在我的正则表达式中,我有一个组,其内容是带有破折号的数字:

00-111-222-333-44

如何使用带有破折号字符的正向前瞻来仅选择该组中的数字,目标是当我稍后反向引用该组时,我希望在我的输出中这样做:

0011122233344

类似这样,但对于整个字符串,现在表达式只匹配破折号前的第一个数字,即 00:

[0-9]+(?=-)

有没有更简单的方法来选择该组内的所有数字,忽略破折号,这样我就可以反向引用该组并获得没有破折号的干净数字?

【问题讨论】:

  • 为什么是正则表达式?难道你不能用空字符串替换所有连字符来得到你想要的吗?
  • 好吧,这个数字是包含很多字段和字符的长复杂行的一部分,我在我的正则表达式中使用组来选择特定字段,然后以正确的顺序反向引用它们,我想可以只选择单个正则表达式组内的数字。
  • 好的,请问您需要什么语言的?
  • POSIX 扩展正则表达式,PCRE... 我目前正在使用 sed 和 regex101.com 测试我的正则表达式

标签: regex lookahead backreference


【解决方案1】:

您可以使用以下 perl 命令来替换数字之间出现的所有连字符:

perl -pe 's#(?<=\d)-(?=\d)##g'

【讨论】:

    【解决方案2】:

    如何在该组中使用带有破折号的正向前瞻,以便稍后反向引用该组时它只包含数字?

    这对于正则表达式是不可能的。组只能引用输入字符串的完整子字符串。与其尝试匹配,不如应用两步方法并使用正则表达式替换在匹配之前删除所有破折号。

    【讨论】:

    • 您能否给我一个 posix 正则表达式替换的示例,以在应用我的第二个正则表达式并以正确的顺序反向引用我的 5 个组之前消除破折号。
    • 5 组?我以为你只想要一个?
    • 这是我当前的表达式:/(^.*text:\+)(.*);(text.*)(@.*;)(.*$)/ 第二组包含我的数字带有破折号:(.*),最后我使用以下命令重新排序输出:\1\2\4\3\4\5
    • 我认为应该这样做(从未使用过posix):sed -e 's/-(?=\d)//' -e 's/(^.*text:\+)(\d*);(text.*)(@.*;)(.*$)/\1\2\4\3\4\5/'
    • 嗯,第一个 sed 命令不起作用,但我明白你的意思,我会朝那个方向尝试一下!
    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多