2009-07-28 2 views
1

나는 위키 백과에서 기사를 구문 분석하려고합니다. * page-articles.xml 파일을 사용하여 위키 코드 형식으로 기사를 모두 백업합니다. 형식을 제거하고 원본 텍스트를 얻으려면 정규 표현식을 사용하려고하지만 익숙하지는 않습니다. C#을 프로그래밍 언어로 사용합니다. 정규 표현식의 디자이너 인 Expresso에서 약간의 시도를했지만 재치가 끝났습니다. 여기에 내가 달성하고자하는 것입니다 :C에서 Wikicode를 파싱하기위한 정규식

다음과 같은 구조를 포함 할 수있는 텍스트 : [[TextN]] 또는 [[텍스트 1 | TextN]] 또는 [[텍스트 1 | 텍스트 2 | ... | TextN]]

[[....]] 패턴이 Texti에도 나타날 수 있습니다. 나는 다음과 같은 정규식을 시도 텍스트 withhin 구조를 identifing를 들어

TextN

이러한 구조를 교체하려면 :

\[\[ (.* \|?)* \]\] 

프레소 실행이 하나 무한 루프 보인다. 상대적으로 작은 텍스트를 5 분 후에 테스트 실행을 취소했습니다.

\[\[ .* \]\] 

하지만 같은 라인이있을 때 :

[[Word1]] text inbetween [[Word2]] 

을 표현, 전체 라인을 반환하지

그럼 좀 더 간단한 일이, 내가 괄호 사이에 아무것도 캡처하려는 시도

[WORD1]

[Word2]

여기에서 Regex-Expert의 조언을 통해 문제를 해결할 수 있습니까? 사전에

감사합니다, 프랭크

답변

3

\[\[(.*?\]\]입니다.

키는. *? 이것은 어떤 문자라도 얻을 수 있지만 가능한 한 적은 것을 의미합니다.

편집

중첩 된 태그의 한 가지 방법은 다음과 같습니다이 그 텍스트에 걸쳐 [[과]] 경기뿐만 아니라 보장

\[\[(?<text>(?>\[\[(?<Level>)|\]\](?<-Level>)|(?! \[\[ | \]\]).)+(?(Level)(?!)))\]\] 

.

+0

중첩 태그에서 실패합니다 : [[[NestedTag]]] –

+0

SealedSun이 지적했듯이 중첩 태그를 처리 할 수있는 RegEx가 필요합니다. – Aaginor

+0

중첩 태그는 어떻게 처리합니까? 중첩 태그로 무엇을하고 싶습니까? Treat는 따로 처리되었거나 중첩 된 대괄호를 제거합니까? – Lazarus

1

정규 표현식이 가장 긴 경기 수 항상 찾으려고하기 때문이다. 당신은 값이 문자로 시작하는 경우 그것을 확인 대괄호 +에서 문자, | 기호와 숫자를 일치합니다

\[\[([A-Za-z][A-Za-z\d+]*)(\|\1)*\]\] 

사용 .*

시도를 변경해야합니다.

+0

aaginor에서 태그가 중첩되기를 기대하기 때문에 작동하지 않습니다. [[Tag1 | [[Tag2]] | Tag3]] –

+0

SealedSun이 지적했듯이 중첩 된 태그를 처리 할 수있는 RegEx가 필요합니다. – Aaginor

+0

Regex는 중첩/재귀를 잘 처리하지 못합니다. –

0

Expresso가 효과적이지 않으면 RegexBuddy을 시도해보십시오.

무료는 아니지만 정규식이 샘플 텍스트 섹션과 어떻게 일치하는지 확인할 수있는 우수한 실시간 테스트 환경을 제공합니다.

5

정규 표현식을 사용하지 않을 것입니다 (정규 표현식을 사용하지 않기 때문에 재귀/중첩을 제대로 처리하지 못합니다).

대신 텍스트 을 손으로 *으로 구문 분석합니다.이 경우 특히 어렵지 않습니다.

당신은 각 요소 반면 요소의 스트림으로 텍스트를 나타낼 수는

  • 일반 텍스트 덩어리, 또는
  • 태그 중 하나입니다

태그에 포함될 수 있습니다. 복수 요소 스트림, |으로 분리.

elementStream ::= element* 
element ::= chunk | tag 
chunk ::= TEXT 
tag ::= "[[" elementStream otherStreams "]]" 
otherStreams ::= "|" elementStream otherStreams 

파서는 이러한 정의 각각을 하나의 방법으로 나타낼 수 있습니다. 따라서 elementStream 메서드를 사용하면 element이라는 텍스트를 사용할 수 있으며 다음 두 문자는 "]]"또는 "|"가 아닌 한 사용할 수 있습니다. (태그 안에 있다면). element을 호출 할 때마다 청크 또는 태그 중 하나 인 요소가 반환됩니다.

이것은 본질적으로 재귀 하강 파서입니다. 위키 백과 : http://en.wikipedia.org/wiki/Recursive_descent_parser (기사 불행히도, 복잡/다소 긴)

+0

Yap, 나는 수동으로 pasing하는 것이 하나가 될 것 같아요. 나는 당신이 아직 제안하고있는 방법을 정말로 이해하지 못한다. 그러나 나는 뇌 세포를 하나 또는 두 개씩 보내고있다. – Aaginor

+0

답변에 추가 한 Wikipedia 페이지를보고 싶을 수도 있습니다. –

0

GPL2 당신이, 어쩌면 당신이 Screwturn Wiki의 소스 코드를 확인하고 전문가가 어떻게하는지 볼 수에 대한 문제가되지 않습니다. C#, BTW

+0

나는 코드를 훑어 보았다. 그는 Regex를 사용하지만 중첩 된 태그도 다루지 않습니다. – Aaginor