정규식 제목 문자열에서 공백을 무시하는 방법은 무엇입니까?


107

정규식 패턴을 사용하여 일치 항목을 검색 할 때 대상 문자열의 공백을 무시하는 간단한 방법이 있습니까? 예를 들어 내 검색이 "cats"인 경우 "c ats"또는 "ca ts"를 일치 시키려고합니다. 일치를 강조하기 위해 일치의 시작 및 끝 인덱스 (공백 포함)를 찾아야하고 서식 지정을 위해 공백이 있어야하기 때문에 사전에 공백을 제거 할 수 없습니다.

답변:


124

\s*정규식의 다른 모든 문자 사이에 선택적 공백 문자 를 붙일 수 있습니다 . 당연하지만 조금 길어질 것입니다.

/cats/ -> /c\s*a\s*t\s*s/


감사합니다. 그렇게하는 것 같습니다. 그러나 나는 그들이 줄 바꿈을 따르는 경우에만 선택적 공백 문자를 원한다는 것을 깨달았습니다. 따라서 예를 들어 "c \ n ats"또는 "ca \ n ts"가 일치해야합니다. 그러나 개행이 없으면 "c ats"가 일치하는 것을 원하지 않습니다. 어떻게 할 수 있는지에 대한 아이디어가 있습니까?
스티븐

@Steven, 아래에서 어떻게했는지 확인하면 내 솔루션을 이러한 특정 사례에 쉽게 적용 할 수 있습니다.
Bob

: 그것은이 같은 문자의 검색 기록 할 수있다,이 정규식은 고양이 너무 엄격, 내 생각 @ 크리스 ^([a-z]\s*)+$
하기 Sandeep 카 우르

9

Sam Dufel의 답변에 대한 Steven의 의견 해결

감사합니다. 그렇게하는 것 같습니다. 그러나 나는 그들이 줄 바꿈을 따르는 경우에만 선택적 공백 문자를 원한다는 것을 깨달았습니다. 따라서 예를 들어 "c \ n ats"또는 "ca \ n ts"가 일치해야합니다. 그러나 개행이 없으면 "c ats"가 일치하는 것을 원하지 않습니다. 어떻게 할 수 있는지에 대한 아이디어가 있습니까?

이것은 트릭을 수행해야합니다.

/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/

일치하는 '고양이'의 모든 다양한 변형은 이 페이지 를 참조하세요 .

조건문을 사용하여이 문제를 해결할 수도 있지만 정규식의 javascript 풍미에서는 지원되지 않습니다.


3
너무 못 생겼어. 더 나은 방법이 있어야합니다.
james.garriss 2015-06-18

다음을 사용하여 JS 구문에서 더 읽기 쉽게 만들 수 있습니다 (이 기술은 다른 언어에서도 작동 함).new RegExp('cats'.split('').join('(?:\n\s*)?'))
brianary

7

허용되는 대답은 기술적으로 정확하지만 가능하면보다 실용적인 접근 방식은 정규 표현식과 검색 문자열 모두에서 공백을 제거하는 것입니다.

다음 대신 "내 고양이"를 검색하려는 경우 :

myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)

그냥 해:

myString.replace(/\s*/g,"").match(/mycats/g)

경고 : 모든 공백을 빈 문자열로 바꾸는 것만으로는 정규 표현식에서이를 자동화 할 수 없습니다. 부정에서 발생하거나 정규 표현식을 유효하지 않게 만들 수 있기 때문입니다.


5

\s*검색 문자열의 모든 문자 사이에 넣을 수 있으므로 고양이를 찾고 있다면c\s*a\s*t\s*s\s*s

길지만 물론 동적으로 문자열을 만들 수 있습니다.

여기에서 작동하는 것을 볼 수 있습니다 : http://www.rubular.com/r/zzWwvppSpE


3

공백 만 허용하려면

\bc *a *t *s\b

해야합니다. 탭도 허용하려면

\bc[ \t]*a[ \t]*t[ \t]*s\b

또는 같은 단어 내에서도 \b찾으려면 앵커를 제거하십시오 .catsbobcatscatsup


1

이 접근 방식은이를 자동화 하는 데 사용할 수 있습니다 (다음 예제 솔루션은 Python에 있지만 분명히 모든 언어로 이식 할 수 있음) :

공백을 미리 제거하고 공백이 아닌 문자의 위치를 ​​저장하면 나중에 다음과 같이 원래 문자열에서 일치하는 문자열 경계 위치를 찾을 수 있습니다.

def regex_search_ignore_space(regex, string):
    no_spaces = ''
    char_positions = []

    for pos, char in enumerate(string):
        if re.match(r'\S', char):  # upper \S matches non-whitespace chars
            no_spaces += char
            char_positions.append(pos)

    match = re.search(regex, no_spaces)
    if not match:
        return match

    # match.start() and match.end() are indices of start and end
    # of the found string in the spaceless string
    # (as we have searched in it).
    start = char_positions[match.start()]  # in the original string
    end = char_positions[match.end()]  # in the original string
    matched_string = string[start:end]  # see

    # the match WITH spaces is returned.
    return matched_string

with_spaces = 'a li on and a cat'
print(regex_search_ignore_space('lion', with_spaces))
# prints 'li on'

더 나아가고 싶다면 match 객체를 생성하고 대신 반환 할 수 있으므로이 도우미를 사용하는 것이 더 편리 할 것입니다.

물론이 기능의 성능도 최적화 할 수 있습니다.이 예는 솔루션의 경로를 보여주기위한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.