2013-04-18 77 views
-5

拆分字符串我有我想分成想使用正則表達式模式

var finalQuote = "2012-0001-1"; 
var quoteNum = "2012-0001"; 
var revision = "1" 

我用這樣的

var quoteNum = quoteNum.subString(0,9); 
var revision = quoteNum.subString(quoteNum.lastIndexOf("-") + 1); 

,但不能把它做一個字符串更有效地使用正則表達式?我遇到這樣的模式需要分成兩部分。

var finalQuote = "2012-0001-1"; 
string pat = @"(\d|[A-Z]){4}-\d{4}"; 
Regex r = new Regex(pat, RegexOptions.IgnoreCase); 
Match m = r.Match(text); 
var quoteNum = m.Value; 

到目前爲止我已經到了這裏。但我覺得我沒有使用正確的方法。請指導我。

編輯:我想編輯模式。由於分割的第一部分包含破折號,因此不能使用破折號分割。即,"2012-0001"

+2

我不是一個C#的傢伙,但它有一個'分裂'功能像Javascript?然後你可以只用'finalQuote.split(「 - 」)[1]'並獲得你的'0001'值。 – Shaded

+7

正則表達式幾乎不知道它的效率。 –

+2

如果您有固定數量的字符,最好使用您的子字符串方法。 –

回答

1

我同意別人使用子字符串是一個比正則表達式更好的解決方案。 但是,如果你在使用正則表達式堅持,你可以使用類似:

^(\d{4}-\d{4})-(\d)$ 

未測試,因爲我沒有安裝一個C#環境:

var finalQuote = "2012-0001-1"; 
string pat = @"^(\d{4}-\d{4})-(\d)$"; 
Regex r = new Regex(pat); 
Match m = r.Match(finalQuote); 
var quoteNum = m.Groups[1].Value; 
var revision = m.Groups[2].Value; 

另外,如果你想有一個string[]你可以嘗試(再次,未經測試):

string[] data = Regex.Split("2012-0001-1",@"-(?=\d$)"); 

data[0]quoteNum和將是revision


更新:

Regex.Split說明:

Regex.Split文檔:的Regex.Split方法類似於String.Split方法,不同之處在於Regex.Split拆分由正則表達式而不是一組字符確定的分隔符處的字符串。

-(?=\d$)匹配單個-給它後面a digit followed by the end of the string所以它只會匹配字符串中的最後一個破折號的正則表達式。最後一個數字沒有被消耗,因爲我們使用了zero-width lookahead assertion(?=)

+0

+1。那一線是輝煌的。這個對我有用。你能解釋一下嗎?我不太瞭解。 – naveen

+0

@naveen查看我更新的答案。 – rvalvik

4

我會簡單地去:

var quoteNum = finalQuote.Substring(0,9); 
var revision = finalQuote.Substring(10); 

quoteNum將包括前9個字符,而10日的revision,一切都可以跟隨10日,如如果修訂版本是10或更高版本,它仍然可以工作。

使用複雜的正則表達式或擴展方法很快就過分了;有時候簡單的方法本身就足夠有效。

1

s如果你新來的人會理解的話,將來會更容易維護。

你可以使用:

var finalQuote = "2012-0001-1"; 
string[] parts = finalQuote.Split("-"); 
var quoteNum = parts[0] + "-" + parts[1] ; 
var revision = parts[3]; 

但是如果你堅持,你需要一個正則表達式,然後

(\d{4}-\d{4})-(\d) 

有兩組在這個表達式中,1所拍攝的第一部分和第2組捕獲第二部分。

var finalQuote = "2012-0001-1"; 
string pat = @"(\d{4}-\d{4})-(\d)"; 
Regex r = new Regex(pat, RegexOptions.IgnoreCase); 
Match m = r.Match(finalQuote); 
var quoteNum = m.Groups[1].Value; 
var revision = m.Groups[2].Value; 
+0

謝謝,我明白了。這是尋找的東西。你可能想改變這樣的代碼,對吧? 'var quoteNum = m.Groups [1] .Value; var revision = m.Groups [2] .Value;'as'Groups [0] .value'返回傳遞的字符串本身。我真的希望學習和你的代碼爲我工作出色。再次感謝 – naveen

+0

我本來希望標記你的答案太:)再次感謝.... – naveen