2010-11-30 2 views
5

나는 이것을 1 시간 동안 견뎌 왔고 루아 패턴 일치 유틸리티가있는로드 블록에서 자신을 발견했다. 따옴표로 묶인 텍스트를 문자열과 일치 시키려하고 필요한 경우 바꿉니다.인용 된 텍스트의 적절한 Lua 패턴은 무엇입니까?

내가 지금까지 함께 온 패턴은 다음과 같습니다 (\ [\ "\ ']?) (.-) % 1

이 어떤 경우에 작동

하지만, 모든 경우 :

Working: "This \"is a\" string of \"text to\" test with" 

Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h" 

작동하지 않는 예제에서는 일치시키고 싶습니다 (원하는 일치를 얻는 함수를 만들었습니다. 루어 패턴이이 작업을 수행 할 수 있는지 궁금해서 gsub과 함께 사용할 패턴을 찾고 있습니다).

string 
a" string" of 
is' a" string" of' text 
test 
his "is' a" string" of' text" to "test" wit 

대신 당분간 제 기능을 사용하십시오. 그러나 내가 사용할 수있는 패턴이 있거나 사용하고 있어야하는 패턴이 있다면 궁금합니다. 패턴이있는 것이 빠져 있습니다.

(약간 편집 내가 포맷하기 stackoverflows 잊어 C/B)

+0

가능한 [RegEx는 XHTML 자체 포함 태그를 제외한 공개 태그와 일치] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

답변

5

정규식을 사용하여 이스케이프 된 인용 텍스트를 일치시키려는 시도는 잔디 깍는 기계를 사용하여 필드에서 데이지 (및 daises 만)를 제거하는 것과 같습니다.

은 내가이 올바른 움직임이다

을 원하는 일치를 유도 할 수있는 기능을했다.루아 패턴이 실용적인 관점에서이

을 할 수 있다면

내가 궁금해서, 패턴이 작업을 수행 할 수 경우에도, 당신은하고 싶지 않다. 이론적 인 관점에서 짝수 개의 백 슬래시가 앞에 오는 큰 따옴표를 찾으려고합니다. 이것은 확실히 정규 언어이며, 당신이 원하는 정규 표현식은 다음 (루아 인용 규칙) 같은

[[[^\](\\)*"(.-[^\](\\)*)"]] 

것 그리고 인용 된 문자열 # 2를 초래할 것입니다. 그러나 루아 패턴은 이 아니고 정규 표현식입니다. 특히 *을 괄호로 묶은 패턴 뒤에 넣을 수는 없습니다. 그래서 내 생각에이 문제는 루아 패턴 인을 사용하여 해결할 수 없지만 루아 패턴은 오토 마타 이론에서 표준적인 것이 아니기 때문에 증명할 수있는 증명 기법의 몸을 전혀 알지 못합니다.

+0

Norman과 Kevin 모두에게 감사 드리며 기대했던 답변에 정확하게 감사드립니다. – Wolftousen

0

당신이해야 하지 (그것이 내가 HTML을 구문 분석하려고 시도했습니다 가정에 이르는 된 이후 다른 편집은 HTML이 아닌 예를 만들기 위해) 정규 표현식으로 HTML을 구문 분석하려고하면 HTML과 XML은 NOT 정규 언어이며 정규 표현식을 사용하여 성공적으로 조작 할 수 없습니다. 전용 HTML 구문 분석기를 사용해야합니다. Here are lots of explanations why.

+0

html에 대해 부주의 할 수는 없었습니다. 내가 열어 놓은 임의의 파일에서 얻은 테스트 문자열이었습니다. 내가 신경 쓰는 부분은 모두 – Wolftousen

+0

이다. HTML이 아닌 예제를 사용하고 그 모호성을 제거 할 것을 제안한다. –

+0

'''과'''를 똑같이 따옴표로 취급하고 있는가? 그렇다면, 예를 들어, ''는 'text'의 "string"에 중복되는 따옴표가 포함되어 있습니다. ""는 '' ''와 '' '' ''또는 '' ' "문자열"또는 3 개 모두? 후자 인 경우 두 번에 걸쳐이 작업을 수행해야합니다. – Mud

2

이스케이프 된 따옴표와 관련된 문제는 일반적으로 따옴표 앞에 홀수의 백 슬래시가 있으면 이스케이프 처리되고 짝수가있는 경우 이스케이프 처리되지 않는 문제입니다. 나는 Lua 패턴 일치가이 조건을 나타 내기에 충분히 강력하다는 것을 믿지 않으므로, 이와 같이 텍스트를 구문 분석해야한다면 다른 방법을 찾아야한다. 아마도 문자열을 반복하여 파싱하거나, 각 인용문을 차례로 찾고 역방향으로 읽거나 백 슬래시가 아닌 문자 (또는 문자열의 시작 부분)를 찾을 때까지 백 슬래시를 계산할 수 있습니다.

어떤 이유로 든 패턴을 반드시 사용해야하는 경우 여러 단계로이 작업을 시도해 볼 수 있습니다. 먼저 행에 두 개의 백 슬래시가 모두있는 경우 gsub를 검색하고 일부 센티널 값으로 바꿉니다. 이 이 문자열에 아직없는 값이어야합니다. 이 문자열에 인쇄 할 수없는 문자가 포함되어 있지 않으면 "\ 001"과 같은 것을 시도해 볼 수 있습니다. 어쨌든 한 줄로 된 두 개의 백 슬래시 시퀀스를 모두 바꾸면 왼쪽의 백 슬래시가 다음 문자를 이스케이프 처리합니다. 이제 원래 패턴을 적용한 다음 마지막으로 센티넬 값의 모든 인스턴스를 두 개의 백 슬래시로 다시 바꿀 수 있습니다.

+0

아마도 LPeg이 그것을 처리 할 수있을 것 같습니까? http://www.inf.puc-rio.br/~roberto/lpeg/lpeg. html –

1

루아의 패턴 언어는 많은 간단한 경우에 적합합니다. 그리고 일반적인 정규 표현식 패키지에서 찾을 수없는 하나 이상의 트릭이 있습니다. 균형 괄호와 일치하는 방법입니다. 그러나 그것도 한계가 있습니다.

한계를 초과하면 LPeg에 도달합니다. LPeg는 Lua에 대해 Parsing Expression Grammer을 구현 한 것으로 Lua의 원작자 중 한 명이 구현하여 Lua 에의 적용이 매우 잘 이루어졌습니다. PEG는 간단한 패턴에서 완전한 언어 문법을 작성하여 작성할 수 있습니다. LPeg은 문법을 바이트 코드로 컴파일하고 매우 효율적으로 실행합니다.

관련 문제