2011-11-14 2 views
1

내가의 패턴에서 짧은 문자열의 무리가 있습니다정규식 스캐너

<text @varible1 more text><, @variable2 text ><@variable3 text text> 

@variableN 장소 홀더이다를, 각 브래킷은 동봉 된 varibale 빈 문자열 인 경우 있음을 나타내는 '섹션'입니다 , 'section'은 없을 것입니다. 정규 표현식을 사용하여 각 섹션을 추출한 다음 해당 변수가 비어 있는지 여부에 따라 전체 문자열을 다시 어셈블 할 생각입니다. 내가 @ 변수 1 =를 전달하는 경우 예를 들어, '안녕하세요'전체 문자열 @ variabl3 = '세계'로 복귀한다

text hello more text, world text 

먼저 나는 어쩌면 내가 작업을 수행하는 데 충분한 정규식 트릭을 사용할 수 있다고 생각에서. 그런 다음 '섹션'이 중첩 될 수 있음을 발견했으며 - 분명히 - '<', '>'및 '@'와 같은 몇 가지 특수 문자를 이스케이프해야합니다. 더 많이 생각할수록 DSL처럼 보입니다. 어쩌면 스캐너를 개발하는 것이 더 좋은 생각일까요? 나는 파서 작성에 대해서만 알고있다. 그래서 나는 좀 붙어 있었고, 어떤 길로 갈지 모릅니다.

누구나 이런 종류의 시나리오에 경험이 있다면, 그걸 밝혀주십시오. 감사.

구문 예제

<text @varible1 more text><, @variable2 text ><@variable3 text text> 
<text @varible1 more text><, @variable2 <, @nestedVaraible> text \<@userName\> > # with nesting and escaping 
<text @varible1 more text><, @variable2 text ><@variable3 \@twitterAccount> # escaping‘@ 

JSLint '당신이이 경우에 재미있을 것 자신의 파서를 작성하기위한 아래 경우

+0

사용하는 언어를 언급하면 ​​안내하기가 더 쉬울 수도 있습니다. 누군가는 이미 구성 할 수있는 것을 가지고 있습니다. 확실히 저에게 파서 문제 같이 소리가 난다. – fncomp

+0

PHP 또는 Python이 좋을 것입니다. – Shawn

+0

Gotcha, 몇 줄을 게시하여 구문의 요지를 얻을 수 있습니까? 아마, 나는 [BeautifulSoup] (http://www.crummy.com/software/BeautifulSoup/documentation.html)을 적용 할 것을 제안 할 것이다. – fncomp

답변

1

PHP 정규 표현식을 사용할 수도 있지만 파서 작성의 아이디어가 열려 있다면 시간을 투자하는 것이 더 좋은 방법이라고 생각합니다. 여기에 내가 텍스트에 맞게 마련했습니다 간단한 정규식입니다 :

$rgx = '~((?:[^<>\\\\]++|(?:\\\\.)++)++)|(<(?:(?1)|(?-1))*+>)~'; 

... 그리고 않는 모든 다른 모든 대 괄호 부분으로 문자열을 분할합니다. 그리고 그것은 단지 한 단계에서 그렇게합니다; 당신은 모든 중첩 된 부분을 제거 할 때까지 각 괄호로 묶인 부분에 재귀 적으로 적용해야합니다. 변수 이름을 찾는 것부터 시작해야하는 다른 모든 처리는 말할 것도 없습니다. Regexes는 놀라 울 정도로 강력 할 수 있지만 더욱 놀라운 것은 정규 표현식을 만들 때 모든 두뇌를 땀을 흘린 후에해야 할 일의 양입니다.

파이썬의 정규 표현식은 그다지 강력하지는 않습니다. 그것은 좋은 일일 것입니다. 그것은 저와 같은 마약 중독자를 정규 표현하는 것이지만 실망 스럽습니다. : P 그 대신에 pyparsing입니다. 나는 그것을 사용하지 않았지만 그것에 대해 좋은 것을 계속 들었다. 그것은 단지 당신이 필요로하는 것일 수도 있습니다.

2

은, 그때 Douglas Crockford 체크 아웃 것'. 그는 모든 코드를 게시하고 정말 좋은 의견을 가지고 있습니다.

좀 더 일반적으로 나는이 편리한 SO 질문을 확실히 확인할 것입니다. Writing a simple parser.