2012-03-24 56 views
1

有一個很難解釋我是什麼意思的位置,所以這裏是我想要做的命名組無論分裂的比賽

我想沿着格局分析任何句子

text #something a few words [someothertext] 

爲此,匹配判決將

Jeremy is trying #20 times to [understand this] 

我會說出4組,文本,時間,誰,字幕

不過,我也可以寫

#20 Jeremy is trying [understand this] times to 

,仍然可以得到令牌 #20 傑里米正試圖 次 理解這個

與右側組

只要分隔的標記可以分開2個文本標記,我很好。

這甚至可能嗎?我已經嘗試了一些正則表達式,並且失敗了(我仍在試驗,但發現自己花費太多時間學習它)

注意:令牌的順序可以是隨機的。如果這是不可能的正則表達式然後我想我可以生活在一個固定的順序。

編輯:修正了一個錯字。進一步澄清我想要的東西。

回答

2

您可以交替使用不同類型的文本。使用命名組意味着每個比賽一個組的Success值等於true。

這種模式應該做你需要的東西:

@"(?<Number>#\d+\b)|(?<Subtitle>\[.+?])|\s*(?<Text>(?:.(?!#\d+\b|\[.*?]))+)\s*" 
  • (?<Number>#\d+\b) - 匹配後跟一個或多個數字#,由字邊界
  • (?<Subtitle>\[.+?]) - 方之間的文本的非貪婪匹配括號
  • \s*(?<Text>(?:.(?!#\d+\b|\[.*?]))+)\s* - 在字符串的任一端修剪空格,並且指定的捕獲組使用一種匹配單個字符的方法,只要該陰性如果檢測到的文本與其他2種感興趣的文本模式(數字和字幕)匹配,則預覽未能匹配。

用法示例:

var inputs = new[] 
{ 
    "Jeremy is trying #20 times to [understand this]", 
    "#20 Jeremy is trying [understand this] times to" 
}; 
string pattern = @"(?<Number>#\d+\b)|(?<Subtitle>\[.+?])|\s*(?<Text>(?:.(?!#\d+\b|\[.*?]))+)\s*"; 
foreach (var input in inputs) 
{ 
    Console.WriteLine("Input: " + input); 
    foreach (Match m in Regex.Matches(input, pattern)) 
    { 
     // skip first group, which is the entire matched text 
     var group = m.Groups.Cast<Group>().Skip(1).First(g => g.Success); 
     Console.WriteLine(group.Value); 
    } 
    Console.WriteLine(); 
} 

或者,這個例子演示瞭如何配對命名組的比賽:

var re = new Regex(pattern); 
foreach (var input in inputs) 
{ 
    Console.WriteLine("Input: " + input); 
    var query = from Match m in re.Matches(input) 
       from g in re.GetGroupNames().Skip(1) 
       where m.Groups[g].Success 
       select new 
       { 
        GroupName = g, 
        Value = m.Groups[g].Value 
       }; 
    foreach (var item in query) 
    { 
     Console.WriteLine("{0}: {1}", item.GroupName, item.Value); 
    } 
    Console.WriteLine(); 
} 
+0

。至少到我的緩慢的大腦,當涉及正則表達式。我發現了另一個海報解決方案(可以接受的令牌位置將被固定的限制),但這更加靈活。謝謝。 – jeremy 2012-03-25 14:24:39

0

所以,如果我理解正確的這個,你要找的四句話:

1)1+普通文本的話
2)1文本的字由前綴#
3)1+話普通文本的
文本 4)1+話裹在[]

我(誠然緩慢和正則表達式少)的建議是找到#的指標,[和]字符,然後用幾個電話到string.Substring()。

對於相對較小的字符串和較少的迭代次數,這是可以接受的,儘管使用更大的字符串會非常緩慢。

+0

是的,我可以通過索引/子去手動解析,但想看看是否有更快的方式通過正則表達式來實現。管理找到一個修復,但不得不放棄選擇任何位置的令牌 - 但我可以生活在那令人印象深刻的 – jeremy 2012-03-25 14:17:59