是否有可能编写一个正则表达式,与String
replaceAll()
一起工作,从一行的末尾删除零或多个空格,并将它们替换为单个句点(.
)。
例如,将使这些(非详尽的)测试用例通过的regex
:
String regex = "????";
assertEquals("foo.", "foo".replaceAll(regex, "."));
assertEquals("foo.", "foo ".replaceAll(regex, "."));
assertEquals("foo.", "foo ".replaceAll(regex, "."));
assertEquals(" foo.", " foo ".replaceAll(regex, "."));
我知道我可以用replaceFirst(" *$", ".")
,但我想知道是否可以用replaceAll()
。
更新添加:这个问题的原因是我正在写一个数据驱动的转换链,它只有replace
和replaceAll
作为允许的转换。我可以用两个replaceAll
变换来做。我只是想知道是否有可能做一次。
您可以使用基于替换的模式来匹配字符串末尾的一个或多个空格,或者匹配前面没有空格的字符串末尾:
+$|$(?<! )
h+$|$(?<!h)
s+$|$(?<!s)
参见regex演示。h
匹配水平空白字符,s
匹配任何空白字符。
同样,$
也可以替换为z
来匹配字符串的末尾。
参见Java演示:
String regex = "\s+\z|\z(?<!\s)";
System.out.println("foo.".equals("foo".replaceAll(regex, ".")));
System.out.println("foo.".equals("foo ".replaceAll(regex, ".")));
System.out.println("foo.".equals("foo ".replaceAll(regex, ".")));
System.out.println(" foo.".equals(" foo ".replaceAll(regex, ".")));
所有的测试用例显示true
作为输出。
你可以确保你的"空间列表";前面有"而不是空格":
(?<=S)s*$
也包含空字符串:
(?<=S|^)s*$
(?<!s)s*$
你可以确保你的"空间列表";前面没有"空格"
代替:你可以确保你的"空间列表";
前面有"而不是空格">因为(?<=S)
(作为字符集)不匹配空字符串,但(?<!s)
匹配。