Java \\ s与\\ s +中的正则表达式

mpl*_*use 90 java regex string quantifiers

请问,这些表达方式之间有什么区别

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 80

第一个匹配单个空格,而第二个匹配一个或多个空格.它们是所谓的正则表达式量词,它们执行这样的匹配(取自文档):

Greedy quantifiers
X?  X, once or not at all
X*  X, zero or more times
X+  X, one or more times
X{n}    X, exactly n times
X{n,}   X, at least n times
X{n,m}  X, at least n but not more than m times

Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}?   X, exactly n times
X{n,}?  X, at least n times
X{n,m}? X, at least n but not more than m times

Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+   X, exactly n times
X{n,}+  X, at least n times
X{n,m}+ X, at least n but not more than m times
Run Code Online (Sandbox Code Playgroud)

  • 我一直很喜欢他们如何提供每个量词的贪婪,不情愿和占有欲版本的单独描述,然后对这三个量的说法完全相同.;) (18认同)

ars*_*jii 54

replaceAll无论是什么,这两个调用总会产生相同的结果x.但是,重要的是要注意两个正则表达式是不一样的:

  • \\s - 匹配单个空白字符
  • \\s+ - 匹配一个或多个空白字符的序列.

在这种情况下,它没有任何区别,因为你用空字符串替换所有东西(尽管\\s+从效率的角度来看最好使用).如果您使用非空字符串替换,则两者的行为会有所不同.

  • @ user3705478两者都会产生相同的结果,即使彼此之后会有多个空格.不同之处在于它的处理方式.如果你有一组(例如)3个空格直接相互跟随\\ s +接受该组并将其整体转换为"",而\\ s将自己处理每个空间. (2认同)

anu*_*ava 11

首先,您需要了解两个语句的最终输出将是相同的,即从给定字符串中删除所有空格.

然而x.replaceAll("\\s+", "");,修剪空间将是更有效的方法(如果字符串可以有多个连续的空格),因为正则表达式一次\\s+匹配1个或多个空格并用空字符串替换它们,可能会减少替换次数.

因此,即使您从两者获得相同的输出,最好使用:

x.replaceAll("\\s+", "");
Run Code Online (Sandbox Code Playgroud)