空格匹配正则表达式 - Java

123
Java的正则表达式 API 表示 \s 可以匹配空格。因此,正则表达式 \\s\\s 应该匹配两个空格。
Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");

这是为了将所有连续的两个空格替换为一个空格。但实际上并不起作用。
我是否对正则表达式或“空格”一词有严重误解?

1
String类有一个replaceAll函数,可以帮你节省几行代码。http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html - Zach L
1
这不是你的误解,而是Java的问题。尝试拆分像“abc \xA0 def \x85 xyz”这样的字符串,你就会明白我的意思:那里只有三个字段。 - tchrist
5
你尝试过使用 "\s+" 吗?这样可以将两个或更多的空格替换为一个。 - hrzafer
1
我已经想了一个多小时,为什么我的 \s 分割没有在空格上分割。非常感谢! - Marcin
11个回答

-3
在正则表达式中使用空格是一件麻烦的事情,但我相信它们是有效的。可以使用StringTokenizer或split()方法来解决OP的问题。然而,如果要使用正则表达式(取消println()的注释以查看匹配器如何分割字符串),以下是一个示例代码:
import java.util.regex.*;

public class Two21WS {
    private String  str = "";
    private Pattern pattern = Pattern.compile ("\\s{2,}");  // multiple spaces

    public Two21WS (String s) {
            StringBuffer sb = new StringBuffer();
            Matcher matcher = pattern.matcher (s);
            int startNext = 0;
            while (matcher.find (startNext)) {
                    if (startNext == 0)
                            sb.append (s.substring (0, matcher.start()));
                    else
                            sb.append (s.substring (startNext, matcher.start()));
                    sb.append (" ");
                    startNext = matcher.end();
                    //System.out.println ("Start, end = " + matcher.start()+", "+matcher.end() +
                    //                      ", sb: \"" + sb.toString() + "\"");
            }
            sb.append (s.substring (startNext));
            str = sb.toString();
    }

    public String toString () {
            return str;
    }

    public static void main (String[] args) {
            String tester = " a    b      cdef     gh  ij   kl";
            System.out.println ("Initial: \"" + tester + "\"");
            System.out.println ("Two21WS: \"" + new Two21WS(tester) + "\"");
}}

它会生成以下结果(使用javac进行编译,并在命令提示符下运行):
% java Two21WS 初始值:"a b cdef gh ij kl" Two21WS:"a b cdef gh ij kl"

9
为什么你要做那么多事情,而不直接调用 replaceAll() 呢?WTF!? - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接