2015-01-03 1 views
2
"aaabbcde".scan(/((\w)\2*)/) 

이 줄은 내가 \2*가 무엇을 이해하지 않는 부분루비에서이 정규식은 무엇을합니까?/코드 (( w) 2 *)/

[["aaa", "a"], ["bb", "b"], ["c", "c"], ["d", "d"], ["e", "e"]] 

다음과 같은 결과를 얻을 것이다. 그리고 왜 이것이 2 차원 배열을 생성합니까?

편집 :

난 후 도움 받고 몇 가지 연구를하고 이해하는 것과 그냥 요약. 희망이 비슷한 주제를 검색하는 사람을 도울 것입니다.

정규식을 사용하여 캡처 그룹을 만들 수 있습니다. 그리고 후자의 그룹은 이전의 그룹을 나타낼 수 있습니다. 각} 호는 캡처 그룹입니다. 따라서 /(\w)/을 수행하면 1 개의 그룹을 만들고 모든 단어 문자를 추출하여 각각의 단일 문자를 개별 그룹에 넣습니다.

그래서 두 번째 캡처 그룹을 만들려면 문자열 "rubyy"

Match 1 
1. r 
Match 2 
1. u 
Match 3 
1. b 
Match 4 
1. y 
Match 5 
1. y 

과 같은 것을 얻을 것이다, 당신은이 /((\w))/처럼 괄호의 또 다른 쌍을 추가해야합니다. 그러나 바깥 쪽 괄호 쌍은 첫 번째 그룹이고 안쪽 그룹은 두 번째 그룹입니다. 그리고 이것은 앞뒤로 갈 수 있습니다.

동일한 문자열 "rubyy"이 주어지면, 이와 같은 결과가 나타납니다.

Match 1 
1. r 
2. r 
Match 2 
1. u 
2. u 
Match 3 
1. b 
2. b 
Match 4 
1. y 
2. y 
Match 5 
1. y 
2. y 

당신은 /(()\w)/, 또는 /(\w)()/에 정규식을 변경하고 일어날 것을 볼 시도 할 수 있습니다 (난 그냥 괄호의 내부 쌍 두 번째 그룹 말했다 기억?). http://www.rubular.com은 루비에서 정규 표현식을 실험하기에 좋은 장소입니다.

다른 캡처 그룹을 참조하는 포인터가 "당신이 그룹 # 2에서 무엇을 얻을 내게 줄 (내부 하나는 그룹 # 2) 그래서 원래 /((\w)\2*)/에 대해 물었다 정규식, \2이 부분은 단지 의미하며, 그룹 1 (외부 자식 인 경우 \2)에 넣습니다. 그런 다음 *은 0 이상의 숫자를 의미하는 정규 정규식입니다.이 경우 0보다 큰 그룹 # 2가 추출됩니다.

이해, 당신은 이것을 시도 할 수 /(\w)(\1*)/. 이것도 비슷한 것을 얻을 것이다.하지만 차이점을 실험해야합니다. 그리고 기억, /(\2*)(\w)/ 루비가이 유형의 파에서 연속적으로 실행되기 때문에 작동하지 않는다는 것을 기억하십시오. 평행 구조이므로 \2은 아직 존재하지 않는 캡처 그룹을 가리 킵니다.

+0

정규식; '\ 2'는 내부 참조 자 (두 번째 괄호 집합)의 자리 표시 자이며'* '는 0 번 이상의 반복과 일치합니다. – vol7ron

+2

나는 http://rubular.com/이 정규 표현식을 테스트하고 개발하는데 매우 유용하다는 것을 발견했다. –

+0

나는 그것을 사용하고 있습니다. 하지만 고마워, @ BSeven –

답변

3

두 개의 캡처 그룹이 있습니다. 첫 번째 그룹은 ((\w)\2*)이며, 왼쪽에서 오른쪽으로 해석 될 때 첫 번째로 발생합니다. 두 번째 그룹은 (\w)입니다. \2*은 캡처 그룹 # 2의 결과를 0 번 이상 찾습니다. "aaa" 들어

내부 포획 기 (# 2), 제 "a" 일치 \2* 후 다음 두 a 년대 일치 a*을하게된다. 따라서 첫 번째 캡처 그룹은 'aaa'과 일치합니다.

캡처 그룹 # 2는 항상 단 하나의 문자와 일치합니다.

+0

각 괄호 쌍은 캡처 그룹입니다. 알 겠어. 그런 다음'\ w'는 모든 단어 문자를 추출합니다. 괄호는 모든 것을 그룹 (그룹 # 2입니까?)에 넣습니다. 그런 다음'\ 2'는 그룹 # 2와 일치하는 결과를 찾습니다. '*'매치를 한 결과 중 0 점을 얻는다. 나는 그것을 올바르게 이해하고 있는가? –

+0

예,'\ w'는 한 단어 문자를 추출한다고 가정합니다. –

+0

두 번째 캡처 그룹을 무시할 수없는 이유는 무엇입니까? 반복되는 일치 만 표시됩니다. –

0

// 내부의 다음

  • 아무것도
  • \2는 괄호의 두 번째 세트에 일치 무엇을 가리 키도록 (역 참조라고 함) 변수와 일치하는 정규 표현식 패턴에 고려 이 경우는 \w입니다. 다른 괄호와 일치하는 경우 \3을 사용하십시오. 이러한 이스케이프 괄호 캡처 그룹
  • *로 알려진 것은 정규 표현식에 대한 가이드의 과다의 참조, 더 나은 설명은 0 개 이상 일치

입니다. 예 : http://www.regular-expressions.info/refcapture.html

+0

그래서 내부 괄호 쌍은 참조하는 두 번째 집합입니까? –

+0

@ EdmundLee 아니, 내 생각에 효과가 있다고 생각합니다. 그러나 참조하는 그룹에서 역 참조를 사용할 수 있습니다. – vol7ron

+0

외부에서 작동한다고 생각하고 있습니다. 왜냐하면 내가이'(() \ w)'를 실행하면 두 번째 그룹에 일치가 놓이게됩니다. 나는이 루비 정규 표현식 편집기에서 그것을 시도했다. [link] (http://rubular.com/) @ vol7ron –