Ruby의 Regexp.union
및 Regexp.escape
메소드를 살펴보십시오. 텍스트 또는 정규식 문자열을 기반으로 정규식 패턴을 쉽게 생성 할 수 있습니다.
이
은
union
문서에서입니다 :
는 반환 주어진 패턴의 조합 인 정규 표현식 객체, 즉, 기타 부품을 일치합니다. 패턴은 Regexp 객체 일 수 있습니다.이 경우 해당 옵션은 보존되거나 문자열입니다. 패턴을 지정하지 않으면/(?!) /를 반환합니다. 주어진 패턴에 캡처가 포함되어 있으면 동작이 지정되지 않습니다.
Regexp.union #=> /(?!)/
Regexp.union("penzance") #=> /penzance/
Regexp.union("a+b*c") #=> /a\+b\*c/
Regexp.union("skiing", "sledding") #=> /skiing|sledding/
Regexp.union(["skiing", "sledding"]) #=> /skiing|sledding/
Regexp.union(/dogs/, /cats/i) #=> /(?-mix:dogs)|(?i-mx:cats)/
그리고 escape
문서에서
:
탈출 정규 표현식에서 특별한 의미를 갖는 것 모든 문자. 새로운 이스케이프 된 문자열을 반환하거나 문자가 이스케이프되지 않으면 self를 반환합니다. 모든 문자열에 대해 Regexp.new (Regexp.escape (str)) = ~ str이 true가됩니다.
patterns = [
/.+?\[email protected]/
]
strings = [
'do-not-reply', 'support', 'test', 'service', 'tips', 'twitter', 'alerts', 'survey',
'craigslist.org'
]
regex = Regexp.union(
*patterns,
*strings.map{ |s|
Regexp.new(Regexp.escape("#{ s }@"), Regexp::IGNORECASE) }
)
pp regex
>> /(?-mix:.+?\[email protected])|(?i-mx:do\-not\[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx
상기 적용 :
sample_email_addresses = %w[
user
user+foo
do-not-reply
support
service
tips
twitter
alerts
survey
].map{ |e| e << '@host.com' }
pp sample_email_addresses.map{ |e| [e, !!e[regex]] }
>> [["[email protected]", false],
>> ["[email protected]", true],
>> ["[email protected]", true],
>> ["[email protected]", true],
>> ["[email protected]", true],
>> ["[email protected]", true],
>> ["[email protected]", true],
>> ["[email protected]", true],
>> ["[email protected]", true]]
출력은 각각의 테스트 주소를 포함한리스트를 나타낸다
Regexp.escape('\*?{}.') #=> \\\*\?\{\}\.
이
시작점이다.
true
은 정규 표현식에서 히트가 발생했음을 의미합니다. 즉, 잘못된 것이 있었음을 의미하고,
false
은 깨끗하고 안전하다고 판단했음을 의미합니다.당신은 단지 즉, 전달 된 사람을 원하는 경우, 정규식 히트를 트리거하지 않았다
pp sample_email_addresses.select{ |e| e[regex] }
>> ["[email protected]",
>> "[email protected]",
>> "[email protected]",
>> "[email protected]",
>> "[email protected]",
>> "[email protected]",
>> "[email protected]",
>> "[email protected]"]
:
에만 즉, 실패하는 사람을 원하는 경우, 정규식 일치
pp sample_email_addresses.reject{ |e| e[regex] }
>> ["[email protected]"]
수십 개의 블록을 쓸 필요가 없습니다. 배열에 수십 개의 정규식을 반복 할 수 있습니다. 또는 더 나은 (?) 유지 보수성을 위해 YAML/plaintext 파일에서 찾을 정규식과 가능한 모든 문자열을 작성하고로드하십시오. (매우 자주 *를 자주 수행 할 경우 해당 항목을 피하는 것이 좋습니다. 파일로드의 오버 헤드 - 벤치마킹 및 불필요하게 최적화하지 않음). – Zabba
감사합니다. 수표는 매우 유용 할 것입니다. 수표를 작성하기 위해 반복 처리하는 방법의 예를 보여줄 수 있습니까? 일치가 발견되면 효율적으로 깨지기를 바랍니다. – AnApprentice