0

我不了解 Java 的正则表达式匹配 \s 的工作原理。在下面的简单类中,\s 似乎与 [至少] $ 和 * 匹配,这令人担忧。当我不包含 \s 时,每个单词的最后一个字符都会被切掉。而且,这两个正则表达式似乎都没有捕捉到字符串中的结尾 "。有人请解释发生了什么吗?或者指出一个有用的资源?谢谢。

public class SanitizeText {

        public static void main(String[] args)
                {
                String s = "123. ... This is  Evil !@#$ Wicked %^&* _ Mean ()+<> and ;:' - Nasty. \\  =\"";
                String t = "123. ... This is  Evil !@#$ Wicked %^&* _ Mean ()+<> and ;:' - Nasty. \\  =\"";

                s = s.replaceAll(".[^\\w\\s.]", " ");   // Does the \s match non-space chars? Sees like at least $ and * are matched.
                s = s.replaceAll(" {2,}", " ");

                t = t.replaceAll(".[^\\w.]", " ");              // Why does this regex chopping the trailing char of each word ??
                t = t.replaceAll(" {2,}", " ");

                System.out.println ("s: " + s);
                System.out.println ("t: " + t);
                }
        }

// produces:
// s: 123. ... This is Evil $ Wicked * _ Mean and Nasty . "
// t: 123 .. Thi i Evi Wicke Mea an Nast "
4

2 回答 2

2

\\s不匹配非空格字符。

正则表达式.[^\\w\\s.]将匹配Any character, followed by a non-word, non-space, non-period character

对我来说,它似乎完全一样。

于 2013-05-17T21:29:16.403 回答
2

回答为什么这个正则表达式会切掉每个单词的尾随字符?

.[^\\w.]匹配任何字符 (the .),后跟一个非单词、非点字符,并用空格替换它。所以它匹配单词中的每个最后一个字母和后面的空格。

回答\s 是否匹配非空格字符?看起来至少 $ 和 * 是匹配的。

不,您正在匹配一个 char ( .),后跟一个非单词、非空白字符。所以每次两个字符。

.[^\\w\\s.]

将匹配

Wicked %^&* _
 1.   ^^
 2.     ^^

并且*不匹配,因为后面有一个空格,因此它不会被替换。

于 2013-05-17T21:30:56.790 回答