2013-08-06 81 views
0

我寫了正則表達式來分隔一些文本。我也希望能夠從這個括號'[]'中獲得價值。這是我到目前爲止有:c#正則表達式:從括號中獲取數

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

這就是比如我的文字:

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

我希望能夠到單獨的字類型和NUMER 3和45。現在我只得到類型[ 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 

您還可以得到n1n2type[...]

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 

如果使用Regex來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

大@King王你的答案是一如既往的令人驚歎。謝謝! – user2592968

+0

@ user2592968謝謝! :) –

+0

我會再有一個問題。我做了這樣 正則表達式(@「^(:(命令)(:?????答案|發自)( \ S +)( \ S + \ [?( \ d +)\])到( \ S + \ [( \ d +)\?]))$「)( \ S +?)( +?); 但我得到C2「類型[3]」,後來在N1我只得到「3」。我能做些什麼才能在C2中接收單詞「type」? – 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

對不起King King有點快。不過謝謝你! – user2592968