2012-07-03 4 views
2

루비 사용 Regexp 객체 (또는 유효한 정규 표현식을 나타내는 문자열)를 가져 와서 특정 부분을 조작 할 수 있도록 토큰 화하고 싶습니다.정규식 Tokenize (lex-parse?) 정규식

regex = /var (\w+) = '([^']+)';/ 
parts = ["foo","bar"] 

을하고 배열에서 문자와 각 캡처를 대체하는 대체 문자열 생성 :

특히,이 같은 정규식/문자열을하고 싶습니다

"var foo = 'bar';" 

을 정규식 파싱에 대한 순진한 정규식 기반 접근법 : 예 :

i = -1 
result = regex.source.gsub(/\([^)]+\)/){ parts[i+=1] } 

... 중첩 된 캡처 그룹 또는 비 캡처 그룹 또는 문자 클래스 안에 괄호가있는 정규식과 같은. 따라서 정규 표현식을 의미 적으로 유효한 조각으로 적절하게 나누려는 나의 바람.

Ruby에서 사용할 수있는 기존 Regex 파서가 있습니까? regexes와 완벽하게 일치하는 알려진 정규 표현식 (horror of horror)이 있습니까? 내가 찾지 못한 보석이 있니?

이 질문의 동기는 this question에 대한 깨끗하고 간단한 대답을 찾는 것입니다.

+1

흥미로운 질문입니다. 정규 표현식 자체가 정규 표현식입니까? –

+0

@ acheong87 임의로 중첩 된 캡처 그룹이 주어 졌을 때 나는 생각하지 않습니다. 그러나 정규 언어에 대한 형식주의에 대한 지식은 매우 제한적입니다. – Phrogz

+0

정규식 변수 보간을 살펴 보았습니까? – iain

답변

2

나는 GitHub에서 JavaScript 프로젝트 (Dynamic (?:Regex Highlighting)++ with Javascript!)를 보았습니다. 자유 공간 모드와 비 자유 공간 모드로 작성된 PCRE 호환 정규 표현식을 구문 분석합니다. 정규 표현식은 덜 기능이 풍부한 JavaScript 구문으로 작성되었으므로이 정규 표현식을 쉽게 Ruby로 변환 할 수 있습니다.

정규식에 임의로 중첩 된 괄호 구조가 포함될 수 있으며 JavaScript에는 재귀 정규식 기능이 없으므로 코드는 중첩 된 괄호 트리를 안쪽 밖으로부터 구문 분석해야합니다. 다소 까다 롭지 만 꽤 잘 작동합니다. highlighter demo page에서 시험해보고 정규식을 입력하고 동적으로 강조 표시 할 수 있습니다. 정규식을 구문 분석하는 데 사용되는 JavaScript 정규식은 here으로 기록되어 있습니다.