java - 如何为这个看似简单的案例制作正则表达式?
问题描述
是否可以编写一个正则表达式,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)
请参阅正则表达式演示。\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
为输出。
推荐阅读
- javascript - Array.every 函数并未在 Object 的所有元素上运行
- c# - 在不影响内容的情况下调整窗口大小
- google-sheets - 在 Google 表格中从姓氏中拆分名字
- node.js - 如何让我的函数仅在异步调用完成后返回 200?
- r - 为R中的每个ID按升序生成时间戳
- java - 如何以时间戳/日期时间格式在 Scala 中获取当前时间,以便将其存储在 PG 表中
- if-statement - Airtable If 语句输出 NaN
- jquery - 获取最后 4 条记录而不获取 4 条记录数据 laravel
- javascript - 这是 IE 11 中的错误吗?
- r - R ggplot 在 geom_rect 中添加注释