如何替换多个匹配的正则表达式
我有一组需要应用于一组String的正则表达式替换,
例如:
- 具有单个空格的所有多个空格
("\s{2,}" --> " ")
- 所有。 然后是一个char。 后跟空格后跟char
(\.([a-zA-Z]-->". $1")
所以我会有这样的事情:
String s="hello .how are you?"; s=s.replaceAll("\\s{2,}"," "); s=s.replaceAll("\\.([a-zA-Z])",". $1"); ....
它有效,但想象一下,我试图在长字符串上替换100多个这样的表达式。 不用说这可能有多慢。
所以我的问题是,是否有更有效的方法来使用单个replaceAll(或类似的东西,例如Pattern / Matcher)来推广这些替换
我跟着Java替换了多个不同的… ,
但问题是我的正则表达式不是simple Strings
。
你有这两个replaceAll
调用:
s = s.replaceAll("\\s{2,}"," "); s = s.replaceAll("\\.([a-zA-Z])",". $1");
您可以将它们组合成单个replaceAll
如下所示:
s = s.replaceAll("\\s{2,}|(\\.)(?=[a-zA-Z])", "$1 ");
RegEx演示
查看一次替换多个子字符串并进行修改。
使用Map
。
- 组号为整数键
- Lambdas作为价值观
修改循环以检查匹配的组。 然后使用该组号获取替换lambda。
伪代码
Map> replacements = new HashMap<>() {{ put(1, matcher -> ""); put(2, matcher -> " " + matcher.group(2)); }}; String input = "lorem substr1 ipsum substr2 dolor substr3 amet"; // create the pattern joining the keys with '|'. Need to add groups for referencing later String regexp = "(\\s{2,})|(\\.(?:[a-zA-Z]))"; StringBuffer sb = new StringBuffer(); Pattern p = Pattern.compile(regexp); Matcher m = p.matcher(input); while (m.find()) { //TODO change to find which groupNum matched m.appendReplacement(sb, replacements.get(m.group(groupNum))); } m.appendTail(sb); System.out.println(sb.toString()); // lorem repl1 ipsum repl2 dolor repl3 amet
- 为什么调用Class.forName(“com.mysql.jdbc.Driver”)注册MySQL for JDBC?
- 在Java8中引用具有不同参数的方法
- 绘制边界矩形以选择要记录的区域
- 如何在java swing中创建可resize的矩形?
- xmlsignatureforms的XSLT转换,是xmldocument的一部分?
- MongoDB / Morphia将技术ID保存为ObjectId,尽管它是Java中的String
- 如果我在配置类上使用@ActiveProfiles注释而不是在定义我的bean的类上使用它,那么在Spring中会发生什么?
- Java协变数组不好?
- 当回复有时是一个对象而有时是一个数组时,如何在使用改进时解析JSON回复?