在第二个短划线后需要获取所有内容?

时间:2015-05-28 08:21:29

标签: c# regex

我有以下字符串值:

string str1 = "123-456-test";
string str1 = "123 - 456 - test-test";
string str1 = "123-REQ456-test";
string str1 = "123 - REQ456 - test-test";

我需要在第二个破折号后立即从字符串中获取整个内容。

我尝试了String.Split('-'),但它没有用。我想我需要使用正则表达式,但我找不到正确的正则表达式。请建议。

3 个答案:

答案 0 :(得分:5)

使用IndexOfSubstring之类的字符串方法,这很容易。

string str1 = "123-456-test";
int secondIndex = str1.IndexOf('-', str1.IndexOf('-') + 1);
str1 = str1.Substring(secondIndex + 1); // test

答案 1 :(得分:3)

(?:[^-\n]+-){2}(.*)$

你可以尝试一下。抓住捕获。参见演示。

https://regex101.com/r/tS1hW2/21

答案 2 :(得分:1)

您可以将LINQ Skip(2)Split一起使用,无需在C#中使用正则表达式执行此任务:

string input = "123-456-test";
string res = input.Contains("-") && input.Split('-').GetLength(0) > 2 ? string.Join("-", input.Split('-').Skip(2).ToList()) : input;

结果:

enter image description here

如果您想一直使用正则表达式,可以使用variable-width look-behind in C#

(?<=(?:-[^-]*){2}).+$

请参阅regex demo

示例代码:

var rgx = new Regex(@"(?<=(?:-[^-]*){2}).+$");
Console.WriteLine(rgx.Match("123-456-test").Value);
Console.WriteLine(rgx.Match("123 - 456 - test-test").Value);
Console.WriteLine(rgx.Match("123-REQ456-test").Value);
Console.WriteLine(rgx.Match("123 - REQ456 - test-test").Value);

输出:

test
 test-test
test
 test-test