这是我的第一个堆栈消息。希望你能帮忙。
我有几个字符串我需要分解才能在以后使用。以下是我的意思的几个例子......
fred-064528-NEEDED
frederic-84728957-NEEDED
sam-028-NEEDED
正如你在上面看到的那样,字符串长度变化很大,因此我相信正则表达式是实现我想要的唯一方法。我需要的是第二个连字符后面的其余字符串(' - ')。
我在正则表达式上非常弱,所以任何帮助都会很棒。
提前致谢。
答案 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项