2013-08-06 2 views
0

일부 텍스트를 분리하기 위해 정규 표현식을 작성했습니다. 나는 또한이 괄호 '[]'에서 가치를 얻을 수 있기를 바랍니다. 나는 단지 형 [얻을 이제 별도의 단어 유형 및 numer에 3과 45에 할 수 있도록하려면# regex : 대괄호에서 숫자 얻기

Message from device type[3] to receiver type[45] done; 

:

Regex(@"^(?:(?<C0>Message) from (?<C1>\S+) (?<C2>\S+) to (?<C3>\S+) (?<C4>\S+) (?<C5>.+))$"); 

이 내 텍스트의 예입니다 : 이것은 내가 지금까지 무엇을 가지고 3]을 입력하고 [45]를 함께 입력하십시오.

+0

이 얻을 수있는 적절한 장소에 두 개라는 이름의 그룹을 추가 당신은 단지 괄호를 찾으려면 IndexOf ("[")를 사용하는 것을 고려 했습니까? 정규식은 가장 쉬운 솔루션입니까? –

+0

정규 표현식을 사용하고 싶습니다. 나머지 텍스트도 분리해야하기 때문에 대괄호에 관한 부분 만 추가하면됩니다. 나는 모든 것을 지금 바꾸고 싶지 않아. – user2592968

답변

2
Regex reg = new Regex(@"^(?:(?<C0>Message) from (?<C1>\S+) (?<C2>\S+\[(?<N1>\d+)\]) to (?<C3>\S+) (?<C4>\S+\[(?<N2>\d+)\]) (?<C5>.+))$"); 
Match m = reg.Match("Message from device type[3] to receiver type[45] done"); 

var n1 = m.Groups["N1"].Value;//3 
var n2 = m.Groups["N2"].Value;//45 

또한 n1를 얻을 수 n2type[...]에서 :

Regex reg2 = new Regex(@"\S+\[(\d+)\]");   
var n1 = reg2.Match(m.Groups["C2"].Value).Groups[0].Value; 
var n2 = reg2.Match(m.Groups["C4"].Value).Groups[0].Value; 

//or don't use Regex once you get `type[...]` 
var s = m.Groups["C2"].Value.Split(new string[]{"[","]"}, StringSplitOptions.RemoveEmptyEntries); 
var t = s[0];//type 
var n = s[1];//3 

~ g 단지 typentype[n]의 등이 형식이 고정되어있는 경우

Regex reg = new Regex(@"^(?:(?<C0>Message) from (?<C1>\S+) (?<T1>\S+)\[(?<N1>\d+)\] to (?<C3>\S+) (?<T2>\S+)\[(?<N2>\d+)\] (?<C5>.+))$"); 

var t1 = m.Groups["T1"].Value;//type 
var n1 = m.Groups["N1"].Value;//3 
var t2 = m.Groups["T2"].Value;//type 
var n2 = m.Groups["N2"].Value;//45 
+1

위대한 @ 킹 킹 대답은 항상 놀라운 것입니다. 고맙습니다! – user2592968

+0

@ user2592968 감사합니다. :) –

+0

질문이 하나 더 있습니다. 이 방법으로 처리 했습니까? ( \ S +) (? \ S + \ [(? \ d +) \]에서 Regex (@ "^ (? :(? 명령) (? (? \ S +) (? \ S + \ [( \ d +) \]) (? . +)) $ "); 하지만 C2 형식 인 [3]을 사용하고 나중에 N1에서 "3"만 얻습니다. C2 형 단어 "유형"으로 수신하려면 어떻게해야합니까? – user2592968

0

이 필요한 거라면 나도 몰라 : 나를

MatchCollection names = Regex.Matches("Message from device type[3] to receiver type[45] done;", @"Message from device type\[(3)\] to receiver type\[(45)\] done;"); 

    names[0].Groups[1].Value 
    names[0].Groups[2].Value 
+0

작동하지 않습니다. 나는 이렇게한다 (? \ [] \ S +). 어쩌면 나쁜 접근일까요? – user2592968

+0

찾고있는 규칙 집합을 지정하면 훨씬 쉽게 될 것입니다. (당신이 아는 것이라고 생각하기가 어렵습니다 ...) –

0

이가 시도 알려 : type\[(?<number>[0-9]+)\]

1

, 그냥

Regex(@"^(?:(?<C0>Message) from (?<C1>\S+) (?<C2>\S+)\[(?<C2n>\d+)\] to (?<C3>\S+) (?<C4>\S+)\[(?<C4n>\d+)\] (?<C5>.+))$"); 

그런 다음 숫자가

match.Groups["C2n"].Value 
+0

미안 킹 킹 조금 빨랐어 요. 그러나 어쨌든 당신을 감사하십시오! – user2592968