首页 > 解决方案 > 如何为这个看似简单的案例制作正则表达式?

问题描述

是否可以编写一个正则表达式,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转换来做到这一点。我只是想知道是否有可能做到这一点。

标签: javaregex

解决方案


您可以使用基于交替的模式来匹配字符串末尾的一个或多个空格或之前没有空格的字符串结尾:

 +$|$(?<! )
\h+$|$(?<!\h)
\s+$|$(?<!\s)

请参阅正则表达式演示\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为输出。


推荐阅读