Ruby 정규식의 첫 번째 일치 항목 반환


97

Ruby의 문자열에서 정규식 일치를 수행하고 첫 번째 일치에서 단락시키는 방법을 찾고 있습니다.

처리중인 문자열은 길고 표준 방식 ( match메서드)이 전체를 처리하고 각 일치 항목을 수집하며 모든 일치 항목을 포함하는 MatchData 개체를 반환합니다.

match = string.match(/regex/)[0].to_s

답변:


134

시도해 볼 수 variableName[/regular expression/]있습니다. 다음은 irb의 출력 예입니다.

irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders"
=> "erik kalle johan anders erik kalle johan anders"
irb(main):004:0> names[/kalle/]
=> "kalle"

이것은 경기를하지 않고 장면 뒤에서 첫 번째 결과를 반환합니까?
Gishu

7
다양한 길이 문자열로 벤치마킹하고 C 소스를 살펴본 후 Regex.match가 단락을 수행하고 첫 번째 일치 항목 만 찾습니다.
Daniel Beardsley

3
깔끔한,이 단축키에 대해 몰랐습니다.
Pierre

이 바로 가기에 대한 문서가 있습니까? 나는 상대적으로 간단한 작업이라고 생각하는 것을 높고 낮게 검색하고 이것을 찾은 후에 만 ​​문제를 해결했습니다. 감사!
dmourati

5
@dmourati이 기능은 String # []에 문서화되어 있습니다. 문서에 대해 물어봐 주셔서 감사합니다. 왜냐하면 그것을 읽으면서 나는 capture전체 일치 대신 캡처를 반환 할 수 있는 인수를 찾았 기 때문입니다 .
slothbear

68

당신은 사용할 수 있습니다 []: (같이이다 match)

"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches capture group 1, i.e. what is inside ()
# => "account2"
"foo+account2@gmail.com"[/\+([^@]+)/]    # matches capture group 0, i.e. the whole match
# => "+account2"

4
가장 완전한 답변
akostadinov

23

일치의 존재 만 중요한 경우에는

/regexp/ =~ "string"

어느 쪽이든 전체 문자열 matchscan검색 하는 동안 첫 번째 히트 만 반환해야 합니다. 따라서

matchData = "string string".match(/string/)
matchData[0]    # => "string"
matchData[1]    # => nil - it's the first capture group not a second match


2

정규식 (regex)은 FSM (유한 상태 머신) 일뿐입니다.

FSM은 "이 상태가 가능합니까?"라는 질문에 대답하려고합니다.

일치가 발견 될 때까지 (성공) 또는 모든 경로가 탐색되고 일치가 발견되지 않을 때까지 (실패) 패턴 일치를 계속 시도합니다.

성공하면 "이 상태가 가능합니까?"라는 질문이 나타납니다. "예"로 대답했습니다. 따라서 더 이상 일치가 필요하지 않으며 정규식이 반환됩니다.

참조 이에 대한 자세한 내용은.

또한 다음 정규식이 작동하는 방식을 보여주는 흥미로운 예 입니다. 여기서 정규식은 주어진 숫자가 소수인지 감지하는 데 사용됩니다. 이 예제는 펄에 있지만 루비로도 작성할 수 있습니다.

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