2012-08-14 2 views
0

를 나타내는 설정 파일을 구문 분석합니다. 문자열이 "#"로 시작하면 전혀 캡처해서는 안됩니다.정규식은 # 기호는 주석을 문자열 내가 "테스트"군과 "안녕하세요"그룹을 캡처 둘 필요가</p> <pre><code>Test=Hello World #Some more text Test=Hello World </code></pre> <p>와

아래의 표현은 각각 제 1 및 제 2 문자열 일 :

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#]) 
^((?!#).+)(?:=)(.+[\S]) 

어떻게 논리적 OR이 비 캡처 정규식 그룹 사이의 비트를해야합니까?

나는

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*) 

같은 일을 시도했지만이 올바르게 동작하지 않습니다.

상세 정보

배경 :이 C의 # (.NET 프레임 워크 4.0)에서 수행되고있다. 파일을 한 줄씩 읽습니다. 등호 기호 왼쪽의 텍스트는 변수 이름을 나타내고 이퀄라이제 기호 오른쪽의 텍스트는 변수의 값을 나타냅니다. 이 파일은 설정 파일로 사용되고 있습니다.

일반의 경우 :

참고 : 모든 후행 공백 - 마지막 공백이 아닌 문자의 종료 후 공백을 캡처 할 수 없습니다. 여기에는 두 번째 그룹의 끝과 파운드 기호 사이의 간격도 포함됩니다.

1) 공백을 제외한 모든 문자 다음에 바로 이퀄라이제이션 기호가오고 바로 뒤에 공백 및 파운드 기호가 오는 문자 세트가옵니다. 예 :

this=is valid #text 
s0_is=this #text 
and=th.is #text 
the=characters after the # Pound sign are irrelevant 

2) 두 번째 캡처 그룹과 파운드 기호 사이에 후행 공백이없는 것을 제외하고 경우 1과 동일한 상황. 예 :

this=is valid#text 
s0_is=this#text 
and=th.is#text 
the=characters after the# Pound sign are irrelevant 

3) 1과 2의 경우와 같은 상황. 그러나, # 기호가 전혀없는 곳은 (후행 공백에 관한 위의 주를보십시오). 예 :

this|is valid 
s0_is|this 
and|th.is 
the|characters after the 

특별한 경우 :

를 | (기호 캡처 그룹을 구분하는 데 사용되는)은 이러한 경우의 세를 들어

this=is valid 
s0_is=this 
and=th.is 
the=characters after the 

캡처 그룹은 각각 다음과 같이한다 1) 줄의 첫 번째 문자는 # 기호입니다. 이로 인해 아무 것도 캡처되지 않습니다.

2) # 기호는 = 기호 바로 다음에 나타납니다. 이로 인해 두 번째 캡처 그룹이 null이됩니다.

3) # 기호는 앞서 명시 적으로 언급되지 않은 다른 곳에서 발생합니다. 이로 인해 아무 것도 캡처되지 않습니다.

4) 새 줄의 첫 번째 문자 앞에 공백이 없어야합니다. 그러나이 경우는 실제로 발생하지 않을 것입니다.

5) 이퀄라이제이션 직후의 공백은 유효하지 않습니다. (아무것도 캡처해서는 안)

잘못된 경우 :

th is=is not valid#text 
nor =this#text 
or_this=something 
also= this 

답변

1
^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#])|(?:.*) 

은 경기를

^((?!#).+)(?:=)(.+[\S])(?:[\s]*[#]) 

또는

(?:.*) 

0 시도를 의미한다 (?:.*) 비록
^((?!#).+)(?:=)(.+[\S])(?:(?:[\s]*[#])|(?:.*)) 

종류의 무의미한 것 같다, 왜 당신이 대신 같은 것을 시도하지 말라 :

^((?!#).+)(?:=)(.+?\S)(?:\s*[#])? 

선택적으로 내가 무슨 생각을 당신이해야 할 노력하고 있습니다 마지막 그룹을 일치하는 것, 이 경우에는 더 나은 옵션이 될 것입니다.

+0

나는'(? :. *)'이 무의미한 것처럼 보인다고, 나는 그 사실을 표현하는 방법을 모른다. 나는 당신의 솔루션을 모두 시도했지만 그들은 나를 위해 일하지 않습니다. 'Hello World' 그룹과 함께 문자열의 일부 다른 텍스트 부분을 포함합니다. 뒤에 공백, 파운드 기호 및 그 이후의 모든 것을 포함하지 말아야합니다. – TehTechGuy

+0

은 (. + \ S)의 욕심 많은 행동과 관련이 있으며, –

+0

트릭을해야하는 게으른 대안 (. +? \ S)으로 변경해보십시오. 문자 클래스는 필요하지 않습니다. 단 한가지 : S –

2

나는 이것이 당신이 필요 이상으로 어렵다고 생각합니다. 이 정규식을 시도해보십시오

^(\w+)=([^\s#]+(?:[ \t]+[^\s#]+)+) 

나는 줄 바꿈을 일치하고 다음 라인에 이상 유출되는 것을 방지하기 위해 대신 \s+[ \t]+을 사용 - 입력 가정 정말 물론, 여러 줄입니다. 독립 실행 형 문자열을 선호하는 경우 독립 실행 형 문자열에도 적용 할 수 있습니다.

편집 : 귀하의 코멘트에 대한 답변에서,이 정규식 시도 :

^(\w+)=(\w+(?:[ \t]+\w+)*) 

내가 구속 가정을 피하려고 한 최초의 정규식을 나는 흥분을 조금 얻었다. 모든 단어에 \w+을 사용할 수 있으면 쉽게 알 수 있듯이 훨씬 쉽게됩니다.

+0

이 파일의 실제 목적은'# '기호가 주석 문자로 사용되는 설정 파일을 파싱하는 것입니다. 솔루션은 일부 테스트 케이스에서만 작동하지만 일부 테스트 케이스에서는 작동하지 않습니다. 예제로 게시 한 두 개의 문자열에서 작동하지만'Test = Hello_World #Some more text' 또는 두 번째 캡처 그룹의 부분에 공백이없는 경우에는 작동하지 않습니다. 솔루션을 '^ (\ w +) = ([^ #] + (? : [^ \ s #] +) +)'로 수정했습니다. 반드시 가장 _correct_ 버전 일지는 모르겠지만 작업을 수행합니다 :) 감사합니다! – TehTechGuy

+0

방금 ​​내 대답에 추가 한 정규식을 사용해보십시오. –

+0

'Test = Hello.World #Some more text'와 같이 문자열에 마침표가있는 경우 작동하지 않습니다. 두 번째 캡처 그룹은 "Hello"를 반환합니다. 첫 번째 캡처 그룹은 "="앞에 모든 것이어야하고 두 번째 캡처 그룹은 "#"또는 "#"사이의 모든 것이어야하며 후자는 'Test = Hello World # Some more text'와 같은 문자열에만 사용됩니다 . 첫 번째 문자가 "#"이면 정규식도 아무 것도 반환하지 않아야합니다. – TehTechGuy

관련 문제