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

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

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

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

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

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

提前致谢。

像这样的东西。 它将在第二个’ – ‘后面包含任何内容(除了换行符),包括’ – ‘符号。

 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解决方案,我的答案是以下,我发现很清楚。

皮条客我的LINQ:基于另一篇文章的学习练习

 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线程中所提到的,这不是最快的方式。

只是提供一种不使用正则表达式的替代方案:

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

添加validation味道。

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

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

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

 [^-]*$ 

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

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

这应该工作:

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

这应该是诀窍:

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

正则表达式模式将是

 (?.*)?-(?.*)?-(?.*)?(\s|$) 

那么你可以得到命名组“第二”以获得第二个连字后的测试

或者

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