使用.NET RegEx在第二个' - '之后检索字符串的一部分

时间:2010-08-10 09:59:58

标签: c# .net regex string c#-3.0

这是我的第一个堆栈消息。希望你能帮忙。

我有几个字符串我需要分解才能在以后使用。以下是我的意思的几个例子......

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

正如你在上面看到的那样,字符串长度变化很大,因此我相信正则表达式是实现我想要的唯一方法。我需要的是第二个连字符后面的其余字符串(' - ')。

我在正则表达式上非常弱,所以任何帮助都会很棒。

提前致谢。

6 个答案:

答案 0 :(得分:4)

只是在不使用正则表达式的情况下提供替代方案:

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

添加验证味道。

答案 1 :(得分:2)

如果它们是较大文本的一部分:

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

如果有整行,并且您知道没有其他连字符,您也可以使用:

[^-]*$

另一个选项,如果您将每一行作为字符串,则使用split(同样,根据您是否需要额外的连字符,您可以省略count参数,或者使用LastIndexOf):

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

答案 2 :(得分: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线程所述,这不是最快的方法。

答案 3 :(得分:1)

这应该有效:

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

答案 4 :(得分:0)

这应该可以解决问题:

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

答案 5 :(得分:0)

正则表达式模式将是

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

然后你可以得到命名组“second”以在第二个连字符后得到测试

或者

你可以做string.split('-')并从数组中获取2项