Использование .NET RegEx для извлечения части строки после второй '-' - PullRequest
3 голосов
/ 10 августа 2010

Это мое первое сообщение в стеке. Надеюсь, что вы можете помочь.

У меня есть несколько строк, которые мне нужно разложить для использования позже. Вот несколько примеров того, что я имею в виду ....

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

Как вы можете видеть выше, длины строк сильно различаются, поэтому я считаю, что это единственный способ добиться того, чего я хочу. мне нужен остаток строки после второго дефиса ('-').

Я очень слаб в регулярных выражениях, поэтому любая помощь будет отличной.

Заранее спасибо.

Ответы [ 6 ]

4 голосов
/ 10 августа 2010

Просто чтобы предложить альтернативу без использования регулярных выражений:

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

Добавить проверку по вкусу.

2 голосов
/ 10 августа 2010

Как то так.Это займет все (кроме разрывов строк) после второго «-», включая знак «-».

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, это не самый быстрый способ сделать это.

2 голосов
/ 10 августа 2010

Если они являются частью большого текста:

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

Если они представлены в виде целых строк, и вы знаете, что у вас нет других дефисов, вы также можете использовать:

[^-]*$

Другой вариант, если каждая строка указана в виде строки, это использовать split (опять же, в зависимости от того, ожидаете ли вы дополнительные дефисы, вы можете опустить параметр count или используйте LastIndexOf):

string[] tokens = line.Split("-".ToCharArray(), 3);
string s = tokens.Last();
1 голос
/ 10 августа 2010

Это должно работать:

.*?-.*?-(.*)
0 голосов
/ 10 августа 2010

шаблон регулярного выражения будет

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

, тогда вы можете получить именованную группу "second", чтобы пройти тест после второго дефиса

или

, который вы можете сделатьstring.split('-') и получить 2 элемента из массива

0 голосов
/ 10 августа 2010

Это должно сработать:

([^\-]+)\-([^\-]+)\-(.*?)$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...