RegExp

2010-01-20 23 views
3

을 사용하여 문자열을 분할하는 데 도움주세요.이 문제를 도와주세요. "-action = 1"을 "action"과 "1"로 나눠야합니다.RegExp

string pattern = @"^-(\S+)=(\S+)$"; 
Regex regex = new Regex(pattern); 
string myText = "-action=1"; 
string[] result = regex.Split(myText); 

왜 결과의 길이가 4인지 알 수 없습니다.

도와주세요.

P/S : .NET 2.0을 사용 중입니다.

감사합니다.

안녕하세요, @ "- 대상 = C : \ Program Files \ Release"문자열로 테스트했지만 결과가 정확하지 않은 이유는 왜 결과 길이가 1인지 이해할 수 없습니다. 공백이 있기 때문에 생각합니다. 끈.

나는 그것을 분할 할에 "대상"& "C : \ 프로그램 파일 \ 릴리스"

추가 정보 :이 내 요구 사항입니다 : - : 문자열 1 & 문자열 2 -string1 = 문자열 2 가>로 분할합니다. string1 & string2에는 '-', '='문자는 포함되지 않지만 공백을 포함 할 수 있습니다.

도와주세요. 감사.

+0

안녕하세요, 저는 문자열 테스트 : @ "- 대상 = C가 : \ 프로그램 파일 \ 릴리스"결과의 길이 = 1. 나는 그것이이 있기 때문에 생각하는 이유하지만 부정확 한 결과를 가지고, 나는 이해하지 않는다 공백 문자. "대상"& "C : \ Program Files \ Release"로 분할하고 싶습니다. 도와주세요. 감사. –

답변

3

이 (업데이트 Regex.Split을 추가) 시도 :

string victim = "-action=1"; 
string[] stringSplit = victim.Split("-=".ToCharArray()); 
string[] regexSplit = Regex.Split(victim, "[-=]"); 

편집 : 귀하의 예제를 사용 : 경로가 -이 포함 된 경우

string input = @"-destination=C:\Program Files\Release -action=value"; 
foreach(Match match in Regex.Matches(input, @"-(?<name>\w+)=(?<value>[^=-]*)")) 
{ 
    Console.WriteLine("{0}", match.Value); 
    Console.WriteLine("\tname = {0}", match.Groups["name" ].Value); 
    Console.WriteLine("\tvalue = {0}", match.Groups["value"].Value); 
} 
Console.ReadLine(); 

은 물론,이 코드는 문제가 문자

0

string.split() 사용시 문제점은 무엇입니까? 당신이 분할 배열에서보고 싶은 것보다이 여전히 가능 이상의 매개 변수를 제공한다는 불구하고

string test = "-action=1"; 
string[] splitUp = test.Split("-=".ToCharArray()); 

나는

[0] = "" 
[1] = "action" 
[2] = "1" 
+0

무엇이 잘못 되었나요? 당신은 무료로 입력 검증을하지 않으며, 다르게 처리 할 수도 있습니다 ('-range = 1-2' 상상). – Lucero

+0

RegEx를 사용하면 무료로 * 아무것도 얻을 수 없으며 OP가 보았 듯이 적절한 정규식 문자열을 작성하는 것은 쉬운 일이 아닙니다. 난 그냥 알려지지 않은 (OP의 편집 참조)에 의존하지 않는 합리적으로 실행할 수있는 대안을 제안하고있다 – ZombieSheep

5

분할을 사용하지 마십시오, 단지 Match를 사용 ... 인정 인덱스 (인덱스 1 및 2)로 Groups 컬렉션에서 결과를 가져옵니다.

Match match = regex.Match(myText); 
if (!match.Success) { 
    // the regex didn't match - you can do error handling here 
} 
string action = match.Groups[1].Value; 
string number = match.Groups[2].Value; 
+0

당신은 이유에 대한 그룹의 이름을 지정할 수 있습니다. 어떤 사람이 다른 괄호 집합을 추가하여 나중에 정규 표현식을 약간 변경했다는 것을 상상해보십시오. 그런 다음 모든 색인을 모든 곳에서 변경해야합니다. - 대신 그룹 이름을 사용하십시오. –

+0

아주 간단한 경우에만 인덱스를 사용합니다 (단 하나 또는 두 개의 캡처, 중첩 된 그룹 없음 등). 그렇지 않으면 이름을 사용하면 정규식이 훨씬 강력하고 이해하기 쉽다는 것에 동의합니다. – Lucero

+0

안녕하세요, @ "- destination = C : \ Program Files \ Release"문자열로 테스트했지만 정확하지 않은 결과가 있습니다. 문자열에 공백이 있기 때문에 생각합니다. "대상"및 "C : \ Program Files \ Release"로 분할하려고합니다. –

3

.NET Regex에서는 그룹의 이름을 지정할 수 있습니다.

string pattern = @"^-(?<MyKey>\S+)=(?<MyValue>\S+)$"; 
Regex regex = new Regex(pattern); 
string myText = "-action=1"; 

그런 다음 "일치"를 수행하고 그룹 이름으로 값을 가져옵니다.그의 이야기 Regular Expression Mastery에서

Match theMatch = regex.Match(myText); 
if (theMatch.Success) 
{ 
    Console.Write(theMatch.Groups["MyKey"].Value); // This is "action" 
    Console.Write(theMatch.Groups["MyValue"].Value); // This is "1" 
} 
0

, 마크 도미 누스 attributes학습 펄 저자 (와 fellow StackOverflow user) 랜달 슈워츠에 다음과 같은 유용한 규칙 :

  • 를 사용하여 캡처 또는 m//g [또는 regex.Match(...)] 때를 당신이 지키고 싶은 것을 알아라.
  • 버릴 내용을 알고있는 경우 split을 사용하십시오.