정규식 제목 문자열에서 공백을 무시하는 방법은 무엇입니까?
정규식 패턴을 사용하여 일치 항목을 검색 할 때 대상 문자열의 공백을 무시하는 간단한 방법이 있습니까? 예를 들어 내 검색이 "cats"인 경우 "c ats"또는 "ca ts"를 일치 시키려고합니다. 일치를 강조하기 위해 일치의 시작 및 끝 인덱스 (공백 포함)를 찾아야하고 서식 지정을 위해 공백이 있어야하기 때문에 사전에 공백을 제거 할 수 없습니다.
\s*
정규식의 다른 모든 문자 사이에 선택적 공백 문자 를 붙일 수 있습니다 . 당연하지만 조금 길어질 것입니다.
/cats/
-> /c\s*a\s*t\s*s/
Sam Dufel의 답변에 대한 Steven의 의견 해결
감사합니다. 그렇게하는 것 같습니다. 그러나 나는 그들이 줄 바꿈을 따르는 경우에만 선택적 공백 문자를 원한다는 것을 깨달았습니다. 따라서 예를 들어 "c \ n ats"또는 "ca \ n ts"가 일치해야합니다. 그러나 개행이 없으면 "c ats"가 일치하는 것을 원하지 않습니다. 어떻게 할 수 있는지에 대한 아이디어가 있습니까?
이것은 트릭을 수행해야합니다.
/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/
일치하는 '고양이'의 모든 다양한 변형은 이 페이지 를 참조하세요 .
조건문을 사용하여이 문제를 해결할 수도 있지만 정규식의 javascript 풍미에서는 지원되지 않습니다.
\s*
검색 문자열의 모든 문자 사이에 넣을 수 있으므로 고양이를 찾고 있다면c\s*a\s*t\s*s\s*s
길지만 물론 동적으로 문자열을 만들 수 있습니다.
여기에서 작동하는 것을 볼 수 있습니다 : http://www.rubular.com/r/zzWwvppSpE
공백 만 허용하려면
\bc *a *t *s\b
해야합니다. 탭도 허용하려면
\bc[ \t]*a[ \t]*t[ \t]*s\b
또는 같은 단어 내에서도 \b
찾으려면 앵커를 제거하십시오 .cats
bobcats
catsup
허용되는 대답은 기술적으로 정확하지만 가능하면보다 실용적인 접근 방식은 정규 표현식과 검색 문자열 모두에서 공백을 제거하는 것입니다.
다음 대신 "내 고양이"를 검색하려는 경우 :
myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)
그냥 해:
myString.replace(/\s*/g,"").match(/mycats/g)
경고 : 모든 공백을 빈 문자열로 바꾸는 것만으로는 정규 표현식에서이를 자동화 할 수 없습니다. 부정에서 발생하거나 정규 표현식을 유효하지 않게 만들 수 있기 때문입니다.
이 접근 방식은이를 자동화 하는 데 사용할 수 있습니다 (다음 예제 솔루션은 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 객체를 생성하고 대신 반환 할 수 있으므로이 도우미를 사용하는 것이 더 편리 할 것입니다.
물론이 기능의 성능도 최적화 할 수 있습니다.이 예는 솔루션의 경로를 보여주기위한 것입니다.
'Programing' 카테고리의 다른 글
Git의 diff 출력에서 "@@ -1 +1 @@"은 무엇을 의미합니까? (0) | 2020.08.30 |
---|---|
명령 줄을 사용하여 JavaScript 코드를 어떻게 아름답게 만들 수 있습니까? (0) | 2020.08.30 |
Github를 자바 스크립트 라이브러리의 CDN으로 사용해야합니까? (0) | 2020.08.30 |
C ++ 클래스 메모리 구조에서 "스페이서"를 어떻게 만듭니 까? (0) | 2020.08.30 |
읽기 전용 및 가져 오기 전용 속성을 사용해야하는 경우 (0) | 2020.08.30 |