다음 두 표현의 차이점은 무엇입니까?
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