정규식 : "문자열의 공백 또는 시작"및 "문자열의 공백 또는 끝"지정


127

"stackoverflow"와 패턴 일치를 시도한다고 가정하십시오.

다음을 원합니다 :

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]

다음을 사용하여 두 사이트에 공백이있는 경우 stackoverflow를 구문 분석하는 방법을 알고 있습니다.

/\s(stackoverflow)\s/

문자열의 시작 또는 끝에있는 경우와 동일합니다.

/^(stackoverflow)\s/

/\s(stackoverflow)$/

그러나 정규 표현식을 사용하여 "문자열 또는 공백"과 "문자열 또는 공백"을 어떻게 지정합니까?

답변:


172

다음 중 하나를 사용할 수 있습니다.

\b      #A word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/

또한 경기에 공백을 포함하지 않으려면 lookbehind / aheads를 사용할 수 있습니다.

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.

8
\b너비가 0 인 어설 션입니다. 그것은 어떤 문자도 소비하지 않습니다. 둘러 볼 필요가 없습니다.
Alan Moore

2
참고 대부분의 정규 표현식 구현에 그 \b입니다 만 표준 ASCII , 더 유니 코드 지원을 말할 것입니다. 유니 코드 단어와 일치 해야하는 경우 선택의 여지가 없지만 대신 사용하십시오. stackoverflow.com/a/6713327/1329367
Mahn

4
경기에서 그룹 선택을 제외하는 가장 쉬운 방법은(?:^|\s)
user2426679

7
파이썬에 대한 교체 (?<=\s|^)와 함께 (?:(?<=\s)|(?<=^)). 그렇지 않으면 다음과 같은 결과가 나타납니다.error: look-behind requires fixed-width pattern
user2426679

4
이 단어는 단어 분리기 \b로 " ." 와 같은 다른 문자를 고려 하는 반면, asker는 "space"를 구체적으로 언급했습니다. @ gordy의 솔루션이 더 좋아 보입니다.
Mikhail T.

65

(^|\s)공백 또는 문자열 시작 및 ($|\s)공백 또는 문자열 끝 과 일치 합니다. 함께하면 :

(^|\s)stackoverflow($|\s)

4
이것은 나를 위해 작동하는 유일한 것입니다. 감사합니다 @gordy
robsonrosa

2
이 패턴을 사용하여 바꾸려면 패턴으로 바꾸어 공백을 바꾼 결과로 유지하십시오 $1string$2.
Mahn

이것은 나에게도 효과적입니다. 단어 경계는 내가 원하는 것을하지 않는 것 같습니다. 하나는 공백 이외의 일부 문자 (예 : 대시)와 일치합니다. 이것은 내가 넣어 위해 노력하고 있었다 때문에 나를 위해 그것을 해결 $하고 ^문자 클래스로하지만,이 쇼는 그들은 단지 규칙적인 패턴 그룹에 넣을 수 있습니다.
felwithe

17

내가 사용하는 것은 다음과 같습니다.

 (?<!\S)stackoverflow(?!\S)

가되어 있지 않은 경우 즉, "유래"와 일치 앞에 공백이 아닌 문자가 아니라 다음에 공백이 아닌 문자로.

이것은 "space-or-anchor"접근 방식보다 깔끔한 (IMO) 접근 방식과 마찬가지로 문자열이 단어 문자로 시작하고 끝나는 것으로 가정 \b하지 않습니다.


1
이것을 사용하는 이유에 대한 좋은 설명. 나는 이것을 선택했을 것이지만 테스트중인 문자열은 항상 한 줄입니다.
anonymous-one

7

\b 실제로 단어와 일치하지 않고 단어 경계에서 일치하므로 다음을 수행하십시오.

\bstackoverflow\b

Python의 경우 원시 문자열 을 지정하는 데 도움이됩니다 . 예 :mystr = r'\bstack overflow\b'
Acumenus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.