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


답변:


88

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

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

20
나는 항상 그들이 각 수량 자의 탐욕스럽고, 꺼려하고, 소유욕적인 버전에 대해 별도의 설명을 제공하고 세 가지 모두에 대해 똑같은 말을하는 방식을 좋아했습니다. )
앨런 무어

60

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

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

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


첫 번째 줄에 x가 "도메인을 예약하고 \ n \ n \ n \ n \ n \ n 오늘 온라인으로"인 경우 둘 다 동일한 결과를 생성합니까?
sofs1

3
@ user3705478 서로 뒤에 공백이 여러 개 있더라도 둘 다 동일한 결과를 생성합니다. 차이점은 처리 방식에 있습니다. (예를 들어) 3 개의 공백 그룹이 서로 바로 뒤 따르는 경우 \\ s +는 해당 그룹을 가져와 전체를 ""로 바꾸는 반면 \\ s는 모든 공간을 자체적으로 처리합니다.
Dennie

11

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

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

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

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

2

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


"마지 못해"라는 단어를 긁어보세요. 이 질문은에 관한 \s+것이지 \s+?다른 질문과는 다릅니다.
Alan Moore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.