2016-03-22 29 views
1

我想匹配用逗號分隔的任何三個數字,並且可以用括號開頭和結尾。使用正則表達式從文本中拆分三個整數c#

有效實例是: {30,40,50},[30,40,50],(30,40,50)或30,40,50

它可能也30,40,50 (裝置,可以逗號之後是空間和三個數字中的一個之前)

非有效的例子是: {30,40,50或30,40,50 {[

和後我想只拆分整合。

我想:

Regex regex = new Regex(@"({|(|[)?\d+,\d+,\d+({|(|[)?"); 
Match match = regex.Match(laticeDim.Text); 
if (match.Success) 
{ 
    int[] integers = laticeDim.Text.Trim('{', '}', '[', ']', '(', ')').Split(',') 
     .Select(s => Convert.ToInt32(s)) 
     .ToArray(); 

} 

但我得到了第一行代碼運行時錯誤之上。

有什麼建議嗎?匹配這種表達的最佳方式是什麼?

+0

Try ['{(? \ d +(?:, \ d +){2})} | \ [(? \ d +(?:, \ d +){2})] | \((? \(?!, \ d +){2})\)|(?<![[({])\ b(? \ d +(?:, \ d +){2})\ ])}])'](HTTP://regexstorm.net/tester p =%7B \(%3F%3cval%3E%5CD%2B \(%3F%3A%2C%5CD%2B \)%7B2 %7D \)%7D%7C%5C%5B \(%3F%3cval%3E%5CD%2B \(%3F%3A%2C%5CD%2B \)%7B2%7D \)%5D%7C%5C \(\(%3F%3cval%3E%5CD%2B \(%3F%3A%2C%5CD%2B \)%7B2%7D \)%5C \)%7C \(%3F%3C!%5B%5B \(%7B%5D \)%5CB \(%3F%3cval%3E%5CD%2B \(%3F%3A%2C%5CD%2B \)%7B2%7D \)%5CB \( %3F!%5B%5D \)%7D%5D \)I = +%7b30%2C40%2c50%7D +%5b30%2C40%2c50%5D + \(30%2C40%2c50 \)++ 30%2C40%2c50 %0d%0a%7b30%2c40%2c50 +或+%7b30%2c40%2c50%5d)。使用'match.Groups [「val」]。值' –

回答

1

錯誤

的解釋,因爲你忘了逃跑的特殊字符([您收到了一個錯誤。請注意,你也正在結束你的正則表達式尋找開頭大括號(爲簡單起見,我會打電話給他們全部braces)在你的正則表達式的結尾(固定在我的答案)。

正則表達式的解決方案

此正則表達式應該會更好:({|\(|\[)?\s*\d+,\s*\d+,\s*\d+\s*(}|\)|\])?

它是關於複雜如你是(所以你應該明白)。它也只是稍長一點。

下面是它如何工作的:

#Is there an opening brace? 
(
    {|\(|\[ 
)? 

#Find the numbers, even with spaces. 
    #Note: currently, does not allow spaces between # and comma 
\s* 
\d+,\s* 
\d+,\s* 
\d+\s* 

#Is there a closing brace? 
(
    }|\)|\] 
)? 

變化到C#

我的正則表達式將同時捕獲你想要和不想要的字符串,它也將打破你當前的代碼(我想,但我不不知道C#)。幸運的是,解決所有這些問題應該很容易。

您可以使用.Replace("regex", "")與這些正則表達式:[{}],[\[\]],[)(]刪除大括號。如果你在一個循環中做這個(3次迭代,每個正則表達式),你可以比較原始長度和新字符串的長度。如果長度差值爲1,則發現不匹配,您馬上去檢查下一場比賽。一場比賽之後,所有三次迭代,.Split它在逗號,.Trim空白處,最後,將數字添加到您的數組。

-1

試試這個

[{|(|[)?\d+,\d+,\d+(}|)|]]? 
+2

你能解釋爲什麼/這個正則表達式如何回答這個問題嗎?如果明確區別是什麼,這將對其他人更有幫助。 – Nanhydrin