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

omjgkv6w  于 2022-11-18  发布在  Java
关注(0)|答案(5)|浏览(361)

下面两个表达式有什么区别?

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
92vpleto

92vpleto1#

第一个匹配一个空格,而第二个匹配一个或多个空格,它们就是所谓的正则表达式量词,它们执行如下匹配(取自documentation):

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
mctunoxg

mctunoxg2#

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

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

在这种情况下,这没有什么区别,因为你用一个空字符串替换所有内容(尽管从效率的Angular 来看,使用\\s+会更好)。如果你用一个非空字符串替换,这两者的行为会不同。

puruo6ea

puruo6ea3#

首先,你需要了解两个语句的最终输出是相同的,即从给定的字符串中删除所有空格。
然而,x.replaceAll("\\s+", "");将是修剪空格的更有效的方式(如果字符串可以有多个连续的空格),因为由于正则表达式\\s+一次匹配1个或多个空格并将其替换为空字符串,因此可能会减少替换次数。
因此,即使您从这两种方法得到相同的输出,最好用途:

x.replaceAll("\\s+", "");
iyfjxgzm

iyfjxgzm4#

第一个正则表达式匹配一个空格字符。第二个正则表达式不情愿地匹配一个或多个空格字符。在大多数情况下,这两个正则表达式非常相似,除了在第二种情况下,正则表达式可以匹配更多的字符串,如果它防止正则表达式匹配失败的话。from http://www.coderanch.com/t/570917/java/java/regex-difference

zujrkrfu

zujrkrfu5#

因为第二个参数是空字符串“",所以两种情况的输出没有区别。但如果第二个参数不是空的,例如“_”,则输出会有所不同。例如:

String x = "Text   With     Whitespaces!   ";

然后

x.replaceAll("\\s", "_");

会给予你

"Text___With_____Whitespaces!___"

但是,

x.replaceAll("\\s+", "_");

会给予你

"Text_With_Whitespaces!_"

有关详细信息,请参阅以下内容:https://www.baeldung.com/java-regex-s-splus

相关问题