可以说我有以下输入字符串:
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);
}
问题是,如果单词已经有一个点前缀,它将添加另一个。
我一直在尝试使用[^\\.]
做各种事情。
但是它要么不适用于最后一个输入字符串,要么开始在第一和第二个输入字符串上吃错字符。
如何正确忽略前面已经有一个点的情况?
答案 0 :(得分:5)
您可以使用
.replaceAll("(?<!\\.)\\b\\w+", ".$0")
请参见regex demo。
详细信息
(?<!\\.)
-如果当前位置的左侧紧跟着.
,则反向查找将使匹配失败\\b
-单词边界\\w+
-1个或多个单词字符。替换是一个点和整个匹配值($0
)。
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);
}