【发布时间】:2016-03-14 20:14:17
【问题描述】:
我有一组正则表达式替换,需要应用于一组字符串,
例如:
- 所有带有单个空格的多个空格
("\s{2,}" --> " ") - 全部。后跟一个带有 .后跟空格,后跟字符
(\.([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 Replacing multiple different...,
但问题是我的正则表达式不是simple Strings。
【问题讨论】:
-
你可以使用一个大的正则表达式和
Matcher.appendReplacement。但是,您必须非常小心您的正则表达式 - 因为它可能会变得有些混乱,并且可能会遭受灾难性的回溯。 -
@BoristheSpider 如果我使用它,那么我就会知道使用了哪个正则表达式。
-
不,只需使用捕获组并检查其中有数据。
-
@BoristheSpider 假设我匹配
.A我怎么知道这是否匹配使用\\.([a-zA-Z]) -
如果你有一个模式,例如
(A)|(B),那么你知道,当你得到一个匹配项时,第 1 组或第 2 组将被填充 - 另一个将为空(this bug 除外) .您可以使用它来确定替换。