약간의 문제가 있습니다. 내 문자열에서 는 특수 문자/줄 바꿈이있을 수있다 '\ 연구 \ n'을 내 정규식의개행 문자의 .NET Regex 구문 분석
부 : 내 문자열에서 줄 바꿈을 제외이 정규식을 수정하는 방법
string sRegex = "(?<string>\"+.*\"|'+.*')";
?
도움 주셔서 감사합니다.
약간의 문제가 있습니다. 내 문자열에서 는 특수 문자/줄 바꿈이있을 수있다 '\ 연구 \ n'을 내 정규식의개행 문자의 .NET Regex 구문 분석
부 : 내 문자열에서 줄 바꿈을 제외이 정규식을 수정하는 방법
string sRegex = "(?<string>\"+.*\"|'+.*')";
?
도움 주셔서 감사합니다.
대부분의 언어 (루비를 제외하고)에서는 여러 줄의 구문 분석이 명시 적으로 가능해야합니다. 멀티 라인 파싱이란 개행 문자를 명시 적으로 포함하는 것을 의미하며, 개행시 매치를 암시 적으로 종료하지는 않습니다. DOTNET에서
은 당신이 원하는 :Regex.Match("string", "regex", RegexOptions.Multiline)
와 "정규식"의 내부 2 개 라인을 일치합니다
"regex\nnewline"
처럼 명시 줄 바꿈으로 문자열을 포함해야합니다 :
hello
regex
newline
world
string sRegex = "(?<string>\"+(.*[\r\n]*)\"|'+(.*[\r\n]*)*')";
그것은이
"Akim Khalilov StackOverflow"
나는이 정규식 최적화 할 수 있다는 확신 같은 문자열을 포함해야한다.
샘플 텍스트를 제공하지 않았기 때문에 여기에서 다른 문제를 해결하려고 할 가능성이 있습니다.
귀하의 질문에 완전히 답변 할만한 정보가 충분하지 않다고 생각합니다. 그러나 귀하가 직접 해결할 수있는 충분한 정보를 제공 할 수 있다고 생각합니다.
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>
""+.*""
|
'+.*'
)
");
당신은 당신이 줄 바꿈을 포함하지 그들이 경우에만 인용 문자열을 일치시킬 건가요? 그렇다면 점이 개행과 기본적으로 일치하지 않기 때문에 특별한 작업을 수행 할 필요가 없습니다.을 제외하고는 (나에게 이해가되지 않는) 시작 인용 부호는 정규 표현식이 잘 동작해야한다. 그러나 당신이 쓰는 정규 표현식에 대한 축 어적으로 문자열 리터럴을 사용 나는 두 번째 제이의 제안 : 당신이 조심하는 필요성을 무엇
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"
것은 당신이 하나의 일치를 얻을 수 있습니다 : 예를 들어, 다음과 같이 선언 된 문자열을 주어진. 그러나 다중 행 모드로 전환하면 fee
과 foe
의 두 가지를 얻을 수 있습니다. 마찬가지로 \w+$
은 기본 모드에서는 fum
과 일치하지만 여러 줄 모드에서는 fie
및 fum
과 일치합니다. 그리고 단 한 줄, 여러 줄 또는 기본값 인 어떤 모드에 상관없이 문자 \n
과 항상 일치 할 수 있습니다.
사람들은 또한 한 줄과 여러 줄을 서로 배타적이라고 생각하는 경향이 있습니다. 심지어 싱글 라인이 기본 모드라고 사람들이 보았습니다. 또한 사실이 아닙니다. Singleline
은 점 (.
)의 동작을 변경하고 Multiline
은 앵커의 동작을 변경합니다 (^
및 $
). 그게 다야.
헝가리에서 C#으로 명명되었습니다. –
일치하는/제외 할 항목의 예를 포함시킬 수 있다면 도움이 될 것입니다. –
아마도 's'는 정규식 문자열 자체가 아니라 정규식이 일치해야하는 문자열을 의미 할 수 있습니다. 어쨌든 사람이 바랄 수 있습니다. ;) –