답변:
\s*
정규식의 다른 모든 문자 사이에 선택적 공백 문자 를 붙일 수 있습니다 . 당연하지만 조금 길어질 것입니다.
/cats/
-> /c\s*a\s*t\s*s/
^([a-z]\s*)+$
Sam Dufel의 답변에 대한 Steven의 의견 해결
감사합니다. 그렇게하는 것 같습니다. 그러나 나는 그들이 줄 바꿈을 따르는 경우에만 선택적 공백 문자를 원한다는 것을 깨달았습니다. 따라서 예를 들어 "c \ n ats"또는 "ca \ n ts"가 일치해야합니다. 그러나 개행이 없으면 "c ats"가 일치하는 것을 원하지 않습니다. 어떻게 할 수 있는지에 대한 아이디어가 있습니까?
이것은 트릭을 수행해야합니다.
/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/
일치하는 '고양이'의 모든 다양한 변형은 이 페이지 를 참조하세요 .
조건문을 사용하여이 문제를 해결할 수도 있지만 정규식의 javascript 풍미에서는 지원되지 않습니다.
new RegExp('cats'.split('').join('(?:\n\s*)?'))
허용되는 대답은 기술적으로 정확하지만 가능하면보다 실용적인 접근 방식은 정규 표현식과 검색 문자열 모두에서 공백을 제거하는 것입니다.
다음 대신 "내 고양이"를 검색하려는 경우 :
myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)
그냥 해:
myString.replace(/\s*/g,"").match(/mycats/g)
경고 : 모든 공백을 빈 문자열로 바꾸는 것만으로는 정규 표현식에서이를 자동화 할 수 없습니다. 부정에서 발생하거나 정규 표현식을 유효하지 않게 만들 수 있기 때문입니다.
\s*
검색 문자열의 모든 문자 사이에 넣을 수 있으므로 고양이를 찾고 있다면c\s*a\s*t\s*s\s*s
길지만 물론 동적으로 문자열을 만들 수 있습니다.
여기에서 작동하는 것을 볼 수 있습니다 : http://www.rubular.com/r/zzWwvppSpE
이 접근 방식은이를 자동화 하는 데 사용할 수 있습니다 (다음 예제 솔루션은 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 객체를 생성하고 대신 반환 할 수 있으므로이 도우미를 사용하는 것이 더 편리 할 것입니다.
물론이 기능의 성능도 최적화 할 수 있습니다.이 예는 솔루션의 경로를 보여주기위한 것입니다.