正则表达式-添加点前缀,排除已经有点的单词

时间:2018-08-03 09:34:28

标签: java regex processing

可以说我有以下输入字符串:

range (bar | thumb_1 | thumb_2 | fill)
range(bar|thumb_1|thumb_2|fill)
.root.range.bar

然后我想要以下输出:

.range (.bar | .thumb_1 | .thumb_2 | .fill)
.range(.bar|.thumb_1|.thumb_2|.fill)
.root.range.bar

到目前为止,我有这个:

void setup() {
  test("range (bar | thumb_1 | thumb_2 | fill)");
  test("range(bar|thumb_1|thumb_2|fill)");
  test(".root.range.bar");
}

void test(String in) {
  String r  = in.replaceAll("(\\w+)", "\\.$1"); // add . prefix to every word 
  println(r);
}

问题是,如果单词已经有一个点前缀,它将添加另一个。 我一直在尝试使用[^\\.]做各种事情。 但是它要么不适用于最后一个输入字符串,要么开始在第一和第二个输入字符串上吃错字符。

如何正确忽略前面已经有一个点的情况?

2 个答案:

答案 0 :(得分:5)

您可以使用

.replaceAll("(?<!\\.)\\b\\w+", ".$0")

请参见regex demo

详细信息

  • (?<!\\.)-如果当前位置的左侧紧跟着.,则反向查找将使匹配失败
  • \\b-单词边界
  • \\w+-1个或多个单词字符。

替换是一个点和整个匹配值($0)。

查看online Java demo

String s = "range (bar | thumb_1 | thumb_2 | fill)\nrange(bar|thumb_1|thumb_2|fill)\n.root.range.bar";
System.out.println(s.replaceAll("(?<!\\.)\\b\\w+", ".$0")); 
// => .range (.bar | .thumb_1 | .thumb_2 | .fill)
//    .range(.bar|.thumb_1|.thumb_2|.fill)
//    .root.range.bar

答案 1 :(得分:-1)

您可以先删除所有点,然后添加它们 像这样(我仅编辑了test(String in)方法):

void test(String in) {
    String r  = in.replaceAll(".","");
    r = r.replaceAll("(\\w+)", "\\.$1"); // add . prefix to every word 
    println(r);
}