5

我正在尝试为我的问题创建一个适当的正则表达式,但显然遇到了奇怪的问题。

让我描述一下我正在尝试做的事情..

我的目标是从字符串的两端删除逗号。例如,字符串, ,, ,,, , , Hello, my lovely, world, ,, ,应该变成 just Hello, my lovely, world

我准备了以下正则表达式来完成此操作: (\w+,*? *?)+(?=(,?\W+$))

它在正则表达式验证器中就像一个魅力,但是当我尝试在 Android 设备上运行它时,matcher.find()函数会挂起约 1 分钟以找到合适的匹配项......我认为,问题出在我正在使用的积极前瞻中,但是除了从开头和结尾分别修剪逗号之外,我找不到任何更好的解决方案:

output = input.replaceAll("^(,?\\W?)+", ""); //replace commas at the beginning
output = output.replaceAll("(,?\\W?)+$", ""); //replace commas at the end

在 Java 正则表达式的积极前瞻中我是否缺少一些东西?如何检索开头和结尾逗号之间的字符串部分?

4

1 回答 1

8

如果您使用匹配组,则不必使用前瞻。尝试正则表达式^[\s,]*(.+?)[\s,]*$

编辑:将其分开,^匹配行的开头,如果使用,这在技术上是多余的,matches()但在其他地方可能有用。[\s,]*匹配零个或多个空白字符或逗号,但贪婪 - 它会接受尽可能多的字符。(.+?)匹配任何字符串,但尾随的问号指示它匹配尽可能少的字符(非贪婪),并且还将内容捕获到“组 1”,因为它形成了第一组括号。非贪婪匹配允许最终组包含相同的零个或多个逗号或空格 ( [\s,]*)。与 一样^,final$匹配行尾——对 有用find()但对matches().

如果您只需要它来匹配空格,请替换[\s,][ ,].

这应该有效:

Pattern pattern = Pattern.compile("^[\\s,]*(.+?)[\\s,]*$");
Matcher matcher = pattern.matcher(", ,, ,,, , , Hello, my lovely, world, ,, ,");
if (!matcher.matches())
    return null;
return matcher.group(1); // "Hello, my lovely, world"
于 2012-10-09T00:09:53.433 回答