2012-12-08 63 views
1

我不知道爲什麼,但由於某種原因正則表達式拆分方法正在我的頭上。我試圖通過教程尋找我需要的東西,似乎無法找到任何東西。使用Regex.Split刪除任何非數字和分裂 -

我只是在閱讀一個excel文檔,並想格式化一個字符串,如$145,000-$179,999給我兩個字符串。 145000179999。同時,我想修剪一個字符串,例如'$180,000-Limit,只是180000

var loanLimits = Regex.Matches(Result.Rows[row + 2 + i][column].ToString(), @"\d+"); 

上面的代碼似乎砍'$145,000-$179,999成4個部分:145000179999。關於如何實現我所問的任何想法?

回答

2

正則表達式完全匹配字符(沒有關於正則表達式中「數字」或「單詞」概念的知識 - 您必須在表達式中自定義)。您正在使用的表達式\d+使用字符類別\d,這意味着任何數字0-9(並且+表示匹配一個或多個)。因此,在表達式$145,000中,請注意您正在查找的部分不只是由數字組成;它還包括逗號。所以正則表達式會查找與正則表達式匹配的每個連續字符組,這是四組數字。

有幾種方法可以解決這個問題。

  1. 包括在你的正則表達式,,所以(\d|,)+,這意味着比賽在一排是要麼數字或逗號儘可能多的字符。將會有兩個匹配項:145,000179,999,從中您可以進一步刪除逗號爲myStr.Replace(",", "")。 (DEMO
  2. 按照您在標題中所說的操作,並刪除所有非數字字符。所以你可以使用Regex.Replace[^\d-]+這個表達式 - 這意味着匹配任何不是數字或連字符的東西 - 然後用""代替它們。然後結果將是145000-179999,您可以使用簡單的非正則表達式拆分myStr.Split('-')來拆分,以獲得您的兩個部分。 (DEMO

注意你的第二個例子($180,000-Limit),你需要一個額外的檢查來算第一個例子來自Match返回結果的數量,並在第二個例子中,以確定是否有Split是範圍內的兩個數字,或者只有一個數字。

+0

你先生,太棒了。非常感謝你。你放在那裏的小「DEMO」非常有幫助。感謝您的知識! –

+0

@JustinPeterson:見注。你需要一些特殊的邏輯來處理只有一個數字的第二種情況。當然是 – mellamokb

+0

。那麼我將這些數字添加到列表中,以便檢查是否有第二個值。在這個檢查上,我只是簡單地添加一個默認值,如果計數<2 –

1

你可以嘗試通過吐涎它的基礎上分別對待每串 - 並提取只有數字從它

ArrayList mystrings = new ArrayList(); 
List<string> myList = Result.Rows[row + 2 + i][column].ToString().Split('-').ToList(); 

foreach(var item in myList) 
{ 

    string result = Regex.Replace(item, @"[^\d]", ""); 
    mystrings.Add(result); 
} 
1

使用正則表達式的替代方法是使用內置的字符串和焦炭的方法在DOTNET的框架。假設輸入串將總是有一個單一的連字符:

string input = "$145,000-$179,999"; 

var split = input.Split('-') 
     .Select(x => string.Join("", x.Where(char.IsLetterOrDigit))) 
     .ToList(); 

string first = split.First(); //145000 
string second = split.Last(); //179999 
  1. 第一您使用標準Split方法拆分字符串
  2. 然後創建通過選擇性地僅取字母或數字從每個項目在一個新的字符串集合:x.Where...
  3. 然後可以使用標準Join方法
  4. 最後加入字符串,採取集合中的第一個和最後一個項目爲您的2串。