如何为这个看似简单的情况做一个正则表达式?



是否有可能编写一个正则表达式,与StringreplaceAll()一起工作,从一行的末尾删除零或多个空格,并将它们替换为单个句点(.)。

例如,将使这些(非详尽的)测试用例通过的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()

更新添加:这个问题的原因是我正在写一个数据驱动的转换链,它只有replacereplaceAll作为允许的转换。我可以用两个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)匹配。

Regex101演示

相关内容

  • 没有找到相关文章

最新更新