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

3

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

我有几个字符串需要以后使用时拆分。以下是我所说的示例...

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

如上所示,字符串长度差异很大,因此我认为正则表达式是实现我想要的唯一方法。我需要的是第二个连字符(“-”)后面的字符串的其余部分。

我对正则表达式非常薄弱,所以任何帮助都将是极好的。

提前致谢。


我把你的问题作为一个小练习来学习:https://dev59.com/RE_Ta4cB1Zd3GeqPCqv9谢谢! - Matt Jacobsen
6个回答

4

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

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

添加适当的验证。

2
你需要在这里使用s.SubString(x + 1),否则它会包含最后一个“-”。 - Kobi

2

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

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

如果整行都是表现形式,并且你知道没有其他连字符,你也可以使用以下方式:

[^-]*$

如果您每行都是字符串,另一种选择是使用split(取决于您是否期望有额外的连字符,您可以省略count参数或使用LastIndexOf):

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

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:基于另一篇帖子的学习练习

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


1

这应该可以工作:

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

0

正则表达式模式将是:

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

然后您可以获取命名组“second”,以获取第二个连字符后的测试

或者

您可以执行string.split('-')并从数组中获取第2项


0

这应该能解决问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接