2010-08-10 54 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

相关问题