【问题标题】:replaceAll method regex [closed]replaceAll 方法正则表达式
【发布时间】:2019-01-07 05:55:03
【问题描述】:

我的示例输入是"0X10001,0X10002,0X610001,0X610002"

System.out.println(st.replaceAll(regex, "0"));

我的输出应该是"010001,010002,610001,610002"
0X 应该替换为
0 --> 如果长度是 7
""--> 如果长度是 8

我必须使用什么正则表达式?
([0X]){1,2} 没有得到想要的输出。

【问题讨论】:

  • 发布您已经拥有并且想要改进的正则表达式。
  • ([0X]){1,2} 没有得到想要的输出。
  • 做两个单独的替换:第一个替换 0X(\d{5})0$1,第二个替换 0X(\d{6})$1
  • @AdrianShum 您需要切换顺序和/或检查单词边界。
  • @shmoesel:是的,我故意不给出完整的正则表达式,而只是给出基本的想法(并期待 OP 自己编写)

标签: java regex replaceall


【解决方案1】:

这样做:

String st = "0X10001,0X10002,0X610001,0X610002";
System.out.println(st.replaceAll("0X(?=\\d{6})|(0)X(?=\\d{5})", "$1"));

输出

010001,010002,610001,610002

解释

当正则表达式引擎扫描时,模式| 将始终先尝试左侧,然后再尝试右侧,因此随着它的前进,它会首先尝试0X(?=\\d{6}),这是0X 的匹配项,后跟6 位数字(使用零宽度正向预测)。如果匹配,则不会捕获任何内容,因此$1 为空,0X 被空字符串替换。

如果不匹配,它会尝试 (0)X(?=\\d{5}),即匹配 0X 后跟 5 位数字。如果匹配,0 将被捕获到组 1 中,因此 $10,而 0X 将替换为 0

如果都不匹配,正则表达式引擎将在输入字符串的下一个位置重试。

【讨论】:

  • 棘手但有趣:)
  • 感谢@Andreas 的解释和回答
【解决方案2】:

replaceAll("0X(?=\\d{6})|(0)X(?=\\d{5})", "$1") 对于给定的问题工作正常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    相关资源
    最近更新 更多