java replaceAll和'+'匹配

时间:2011-07-08 16:21:41

标签: java regex

我有一些代码设置可以删除标题词之间的额外空格

String formattedString = unformattedString.replaceAll(" +"," ");

我对这种类型的正则表达式的理解是它会在停止之前匹配尽可能多的空格。但是,我的字符串不会以任何方式改变。它是否有可能一次仅匹配一个空格,然后用空格替换它?对于replaceAll方法有什么东西,因为它正在进行多次匹配,这会改变这种类型的匹配在这里的工作方式吗?

3 个答案:

答案 0 :(得分:1)

更好的方法可能是使用"\\s+"来匹配所有可能的空白字符的运行。

修改

另一种方法可能是提取"\\b([A-Za-z0-9]+)\\b"的所有匹配项,然后使用空格加入它们,这样可以删除除有效单词和数字之外的所有内容。

如果您需要保留标点符号,请使用"(\\S+)"来捕获所有非空白字符的运行。

答案 1 :(得分:0)

你确定你的字符串是空格而不是制表符吗?以下内容在空格上更具“攻击性”。

String formattedString = unformattedString.replaceAll("\\s+"," ");

答案 2 :(得分:0)

所有回复都应该有效。

这两种:

String formattedString = unformattedString.replaceAll(" +"," ");

String formattedString = unformattedString.replaceAll("\\s+"," ");

也许您的 unformattedString 是一个多行表达式。在这种情况下,您可以实例化Pattern对象

String unformattedString = "  Hello \n\r\n\r\n\r     World";
Pattern manySpacesPattern = Pattern.compile("\\s+",Pattern.MULTILINE);
Matcher formatMatcher = manySpacesPattern.matcher(unformattedString);
String formattedString = formatMatcher.replaceAll(" ");
System.out.println(unformattedString.replaceAll("\\s+", " "));

或者unformattedString可能有特殊字符,在这种情况下你可以使用模式标志和编译方法。 例子:

Pattern.compile("\\s+",Pattern.MULTILINE|Pattern.UNIX_LINES);

Pattern.compile("\\s+",Pattern.MULTILINE|Pattern.UNICODE_CASE);