2009-12-25 2 views
0

약간의 문제가 있습니다. 내 문자열에서 는 특수 문자/줄 바꿈이있을 수있다 '\ 연구 \ n'을 내 정규식의개행 문자의 .NET Regex 구문 분석

부 : 내 문자열에서 줄 바꿈을 제외이 정규식을 수정하는 방법

string sRegex = "(?<string>\"+.*\"|'+.*')"; 

?

도움 주셔서 감사합니다.

+9

헝가리에서 C#으로 명명되었습니다.

+0

일치하는/제외 할 항목의 예를 포함시킬 수 있다면 도움이 될 것입니다. –

+0

아마도 's'는 정규식 문자열 자체가 아니라 정규식이 일치해야하는 문자열을 의미 할 수 있습니다. 어쨌든 사람이 바랄 수 있습니다. ;) –

답변

2

대부분의 언어 (루비를 제외하고)에서는 여러 줄의 구문 분석이 명시 적으로 가능해야합니다. 멀티 라인 파싱이란 개행 문자를 명시 적으로 포함하는 것을 의미하며, 개행시 매치를 암시 적으로 종료하지는 않습니다. DOTNET에서

은 당신이 원하는 :

Regex.Match("string", "regex", RegexOptions.Multiline) 

와 "정규식"의 내부 2 개 라인을 일치합니다

"regex\nnewline" 

처럼 명시 줄 바꿈으로 문자열을 포함해야합니다 :

hello 
regex 
newline 
world 
0

string sRegex = "(?<string>\"+(.*[\r\n]*)\"|'+(.*[\r\n]*)*')"; 

그것은이

"Akim 
Khalilov 
StackOverflow" 

나는이 정규식 최적화 할 수 있다는 확신 같은 문자열을 포함해야한다.

샘플 텍스트를 제공하지 않았기 때문에 여기에서 다른 문제를 해결하려고 할 가능성이 있습니다.

2

귀하의 질문에 완전히 답변 할만한 정보가 충분하지 않다고 생각합니다. 그러나 귀하가 직접 해결할 수있는 충분한 정보를 제공 할 수 있다고 생각합니다.

Regex Workbench (http://code.msdn.microsoft.com/RegexWorkbench). 올바른 정규 표현식을 찾는 데 훌륭한 도구입니다. 제공된 바이너리는 매우 오래된 .NET 용이지만 재 컴파일 할 수 있습니다.

RegexOptions 열거 (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions(VS.71).aspx), 특히 RegexOptions.MultiLine을 검토하십시오. 이것은 아마도 당신이 필요로 할 것입니다.

옵션을 지정하는 방법에는 두 가지가 있습니다. RegexOptions 및 "인라인 구성"(http://msdn.microsoft.com/en-us/library/yd1hzczs(VS.71).aspx)입니다.

string sRegex = "(?<string>\"+.*\"|'+.*')?m"; 

몇 가지 추가 참고 사항 :

내가 \ 정규 표현식에서 이스케이프 문자가 이미 있기 때문에, 정규식을 위해 그대로 문자열을 사용하고를 가진 두 번 탈출 예를 들어, MultiLine는 다음과 같이 지정 될 수 있습니다 사물을 지저분하게 만든다.

Regex 개체에 내 정규 표현식을 문자열에 저장하는 대신 풍부한 형식으로 저장하고 싶습니다.예외는 새로운 정규 표현식을 만들기 위해 문자열을 작성할 때입니다. 이 경우 변수 fooRegexText을 호출하여이를 명확하게합니다.

나는 읽기 어려운 모든 정규 표현식을 발견합니다. 나는 가난한 두뇌를 돕기 위해 정규식에서 공백을 사용한다 (IgnorePatternWhitespace 사용). 그 적용

, 나는 쓸 것 :

 Regex regex = new Regex(
@"(?mx) # MultiLine, IgnorePatternWhitespace 
    (?<string> 
     ""+.*"" 
      | 
     '+.*' 
    ) 
"); 
2

당신은 당신이 줄 바꿈을 포함하지 그들이 경우에만 인용 문자열을 일치시킬 건가요? 그렇다면 점이 개행과 기본적으로 일치하지 않기 때문에 특별한 작업을 수행 할 필요가 없습니다.을 제외하고는 (나에게 이해가되지 않는) 시작 인용 부호는 정규 표현식이 잘 동작해야한다. 그러나 당신이 쓰는 정규 표현식에 대한 축 어적으로 문자열 리터럴을 사용 나는 두 번째 제이의 제안 : 당신이 조심하는 필요성을 무엇

Regex sRegex = new Regex(@"(?<string>"".*""|'.*')"); 

은 탐욕입니다. 당신이 별도로 "foo""bar" 일치 할 것으로 예상 어디에

var s1 = "foo", s2 = "bar"; 

... 정규식, 하나의 일치, "foo", s2 = "bar"을 찾을 수 있습니다 : 예를 들어 이런 식으로 같은 줄에 두 개의 문자열 선언은, 거기 경우. 이를 방지하려면이 아닌 욕심 정량 사용할 수 있습니다 : 당신이
경우 그들에 줄 바꿈으로 문자열을 일치시킬

Regex sRegex = new Regex(@"(?<string>"".*?""|'.*?')"); 

을, 당신은의 동작을 수정합니다 Singleline 옵션을 사용할 수 있습니다 점을 사용하여 줄 바꿈과 일치시킬 수 있습니다.

Regex sRegex = new Regex(@"(?<string>"".*?""|'.*?')", 
         RegexOptions.Singleline); 

...하거나 인라인 수정 사용할 수 있습니다

Regex sRegex = new Regex(@"(?s)(?<string>"".*?""|'.*?')"); 

당신이 만일 Singleline 모드에서 점을 사용할 때 당신이 가능성이 있기 때문에, 비 욕심 정량을 사용하는 것이 특히 중요하다고주의를 경기는 더 이상 한 줄로 제한되지 않습니다.

Regex sRegex = new Regex(@"(?<string>""[^""]*""|'[^']*')"); 

는 점 메타 문자를 사용하지 않기 때문에이 정규식 만일 Singleline 모드를 지정할 필요가 없습니다 : 그러나 여기보다 효율적으로뿐만 아니라 예측의 또 다른 대안이다. 부정 문자 클래스 [^"]은 줄 바꿈을 포함하여 인용 부호를 제외한 모든 문자와 일치합니다.


마지막으로, 나는 그것에 대해 많은 혼란이있는 것 같습니다 같이 Multiline 옵션에 대한 단어를 말하고 싶습니다. 사람들은 대상 텍스트가 여러 줄로 구성 될 때마다 (즉 줄 바꿈 문자가있을 때마다) 반드시 사용해야한다고 생각하는 경향이 있습니다. 이것은 자연스러운 가정이지만 사실이 아닙니다.

모든 다중 행 모드는 시작 및 끝 앵커의 동작을 ^$으로 변경합니다. 대개 전체 문자열의 시작과 끝만 일치하지만 다중 행 모드를 설정하면 문자열 내의 논리 행의 시작과 끝에서도 일치합니다.fee : 당신은 기본 모드에서 정규식 ^\w+을 검색하면

"fee fie\nfoe fum" 

것은 당신이 하나의 일치를 얻을 수 있습니다 : 예를 들어, 다음과 같이 선언 된 문자열을 주어진. 그러나 다중 행 모드로 전환하면 feefoe의 두 가지를 얻을 수 있습니다. 마찬가지로 \w+$은 기본 모드에서는 fum과 일치하지만 여러 줄 모드에서는 fiefum과 일치합니다. 그리고 단 한 줄, 여러 줄 또는 기본값 인 어떤 모드에 상관없이 문자 \n과 항상 일치 할 수 있습니다.

사람들은 또한 한 줄과 여러 줄을 서로 배타적이라고 생각하는 경향이 있습니다. 심지어 싱글 라인이 기본 모드라고 사람들이 보았습니다. 또한 사실이 아닙니다. Singleline은 점 (.)의 동작을 변경하고 Multiline은 앵커의 동작을 변경합니다 (^$). 그게 다야.