[ruby] 정규식의 모든 항목을 일치시키는 방법

Ruby에서 정규 표현식과 일치하는 모든 항목을 찾는 빠른 방법이 있습니까? Ruby STL에서 Regex 객체를 살펴본 결과 Google에서 아무 소용이 없었습니다.



답변

사용 scan하면 트릭을 수행해야합니다.

string.scan(/regex/)


답변

일치하는 모든 문자열을 찾으려면 String의 scan메소드를 사용하십시오.

str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]

MatchDataRegexp match메소드가 리턴 한 오브젝트의 유형 인 원하는 경우 다음을 사용하십시오.

str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]

사용의 이점은 다음 MatchData과 같은 방법을 사용할 수 있다는 것입니다 offset.

match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]

더 알고 싶다면 다음 질문을보십시오.

특수 변수에 대해 읽기 $&, $', $1, $2루비 너무 도움이 될 것입니다.


답변

그룹이있는 정규 표현식이있는 경우 :

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

String의 scan메소드를 사용 하여 일치하는 그룹을 찾을 수 있습니다.

str.scan re
#> [["54"], ["1"], ["3"]]

일치하는 패턴을 찾으려면

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]


답변

사용할 수 있습니다 string.scan(your_regex).flatten. 정규식에 그룹이 포함되어 있으면 단일 일반 배열로 반환됩니다.

string = "A 54mpl3 string w1th 7 numbers scatter3r ar0und"
your_regex = /(\d+)[m-t]/
string.scan(your_regex).flatten
=> ["54", "1", "3"]

정규식도 명명 된 그룹 일 수 있습니다.

string = 'group_photo.jpg'
regex = /\A(?<name>.*)\.(?<ext>.*)\z/
string.scan(regex).flatten

당신은 또한 사용할 수 있습니다 gsub당신이 MatchData을 원한다면 그냥 또 하나의 방법입니다.

str.gsub(/\d/).map{ Regexp.last_match }


답변