2010-08-10 39 views
3

這是我的第一個堆棧消息。希望你能幫助。使用.NET RegEx在第二個' - '後檢索部分字符串

我有幾個字符串我需要分手以備後用。這裏有一對夫婦的我是什麼意思的例子....

fred-064528-NEEDED 
frederic-84728957-NEEDED 
sam-028-NEEDED 

正如你所看到的字符串長度上述變化很大,所以正則表達式我認爲是達到我想要什麼的唯一方式。我需要的是第二個連字符(' - ')後面的字符串的其餘部分。

我在正則表達式很弱,所以任何幫助都會很棒。

在此先感謝。

+0

我用了你的問題,因爲一點點的學習鍛鍊:http://stackoverflow.com/questions/3448269/pimp-my-linq-a-learning-exercise-based-upon-another-sa-question 謝謝! – 2010-08-10 11:33:30

回答

2

就是這樣。在第二個' - '之後,包括' - '符號將會佔用任何東西(換行符除外)。

var exp = @"^\w*-\w*-(.*)$"; 

var match = Regex.Match("frederic-84728957-NEE-DED", exp); 

if (match.Success) 
{ 
    var result = match.Groups[1]; //Result is NEE-DED 

    Console.WriteLine(result); 
} 

編輯:我回答另一個問題,它涉及到這一點。除此之外,它要求提供LINQ解決方案,我的回答如下,我發現非常清楚。

Pimp my LINQ: a learning exercise based upon another post

var result = String.Join("-", inputData.Split('-').Skip(2)); 

var result = inputData.Split('-').Skip(2).FirstOrDefault(); //If the last part is NEE-DED then only NEE is returned. 

正如其他提到的SO線程是不是這樣做的最快方法。

2

如果他們是更大的文本的一部分:

(\w+-){2}(\w+) 

如果都爲整行,你知道你沒有其他的連字符,你也可以使用:

[^-]*$ 

另一種選擇是,如果每行都作爲一個字符串,則使用split(同樣,根據是否需要額外的連字符,可以省略參數count或使用LastIndexOf):

string[] tokens = line.Split("-".ToCharArray(), 3); 
string s = tokens.Last(); 
1

這應該工作:

.*?-.*?-(.*) 
0

這應該做的伎倆:

([^\-]+)\-([^\-]+)\-(.*?)$ 
0

的正則表達式模式將

(?<first>.*)?-(?<second>.*)?-(?<third>.*)?(\s|$) 

那麼你就可以得到命名組 「第二」在第二個連字符後得到測試

或者

可以從陣列

4

string.split('-'),並獲得2項只是爲了提供一種替代,而無需使用正則表達式:

foreach(string s in list) 
{ 
    int x = s.LastIndexOf('-') 
    string sub = s.SubString(x + 1) 
} 

添加驗證的味道。

+2

這裏你需要'sString(x + 1)',或者它包含最後一個'-'。 – Kobi 2010-08-10 10:19:36

+0

感謝您的建議kobi – 2010-08-10 10:21:00

相關問題