[java] Java의 정규식 표현식, \\ s 대 \\ s +

다음 두 표현의 차이점은 무엇입니까?

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



답변

첫 번째는 단일 공백과 일치하는 반면 두 번째는 하나 이상의 공백과 일치합니다. 이들은 소위 정규식 한정자이며 다음과 같은 일치를 수행합니다 ( 문서 에서 가져옴 ).

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


답변

이 두 replaceAll호출은 무엇이든지간에 항상 동일한 결과를 생성합니다 x. 그러나 두 정규식이 동일하지 않다는 점에 유의해야합니다.

  • \\s -단일 공백 ​​문자와 일치
  • \\s+ -하나 이상의 공백 문자 시퀀스와 일치합니다.

이 경우 모든 것을 빈 문자열로 바꾸므로 차이가 없습니다 ( \\s+효율적인 관점에서 사용 하는 것이 더 낫지 만 ). 비어 있지 않은 문자열로 바꾸면 두 가지가 다르게 작동합니다.


답변

우선 두 문장의 최종 출력이 동일하다는 것을 이해해야합니다. 즉, 주어진 문자열에서 모든 공백을 제거하는 것입니다.

그러나 x.replaceAll("\\s+", "");정규식이 \\s+한 번에 하나 이상의 공백을 일치시키고 빈 문자열로 대체 한다는 사실로 인해 잠재적으로 대체가 적기 때문에 공백을 자르는 더 효율적인 방법이 될 것입니다 (문자열에 여러 개의 연속 공백이있을 수있는 경우) .

따라서 둘 다에서 동일한 출력을 얻더라도 다음을 사용하는 것이 좋습니다.

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


답변

첫 번째 정규식은 하나의 공백 문자와 일치합니다. 두 번째 정규식은 하나 이상의 공백 문자와 마지 못해 일치합니다. 대부분의 경우이 두 정규식은 매우 유사하지만, 두 번째 경우 정규식 일치가 실패하지 않도록하는 경우 정규식이 더 많은 문자열과 일치 할 수 있다는 점을 제외하고는 매우 유사합니다. 에서 http://www.coderanch.com/t/570917/java/java/regex-difference


답변