【问题标题】:Java regex replace the group value in original stringJava 正则表达式替换原始字符串中的组值
【发布时间】:2014-03-22 05:42:11
【问题描述】:

我有一个特定的要求,要找到一个模式,并通过保留模式(分隔符)替换原始字符串中匹配组(2)的值,我正在使用模式

:(\w+)[:\|]+(.*)

使用此模式,它可以正确解析值,但我无法替换 group(2) 的值。例如我有一个多行输入字符串

:20:9405601140
:2D::11298666
:28C:20/1

我想用新值(1234)替换标签 20 的值(9405601140),所以我期望的输出是

:20:1234
:2D::11298666
:28C:20/1

谢谢

【问题讨论】:

    标签: java regex replace


    【解决方案1】:

    使用这个:

    input = input.replaceAll("(:20):(\\d+)(?!\\d)", "$1:1234");
    

    这里(\\d+)(?!\\d)正在检查数字after the :20:后面是否没有数字。

    但是,如果您只想在此处替换 :20:9405601140,这很简单:

    input = input.replaceAll(":20:9405601140(?!\\d)", ":20:1234");
    

    【讨论】:

      【解决方案2】:

      您可以通过捕获要保留的内容而不是要替换的内容来实现此目的,然后在替换字符串中使用反向引用($1,用于第一个捕获组)将其包含在最终结果中.

      类似:

      string.replaceAll("(:\\w+[:\\|]+).*", "$11234")
      

      在所有给定的行上执行替换,或者只是:

      string.replaceAll("(:20[:\\|]+).*", "$11234")
      

      仅对以“:20”开头的行进行替换。

      【讨论】:

      • 标签 20 可能重复,值(9405601140)也可以是其他标签的一部分,我只想替换特定标签和特定出现值,我可以选择替换出现,所以需要使用 find ,一旦我发现我必须替换它。
      • 不确定我是否在关注你。如果只需要替换第一个实例,则使用String.replaceFirst。如果这不是您要的,我需要澄清一下。
      【解决方案3】:

      试试这个

      s = s.replaceAll("\\A(?::[:\\|])\\w+", "1234");
      

      【讨论】:

        【解决方案4】:

        反之如何。

        创建一个像 (:(\w+)[:\|]+)(.*) 这样的模式,然后为每一行输出第一个组和您的替换(而不是第 2 组)。

        这是一个工作示例http://ideone.com/9TkGx6

        【讨论】:

        • 此解决方案仅在标签值在同一行时才有效,如果标签值是多行,例如 :20:123213\n45555\n67788 那么它只会替换 123213 但接下来的两行仍然存在。 ..我厌倦了使用 MULTILINE 和 DOTALL 但不起作用。
        猜你喜欢
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2012-04-26
        • 2018-07-13
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多