2013-02-13 2 views
2

Я пытаюсь удалить весь текст перед последним вложением регулярного выражения, не удаляя его или не заменяя его каким-либо другим текстом. Вот несколько строк выборки строк из файла Я разборе:Обрежьте весь текст перед последним совпадением в регулярном выражении

N3.C2.R1: 19 00000000 00000000 00 ** 0000 00000000 00000000 00000000 00000000
N0.C0.R0N3.C3.R1: 19 00000000 00000000 00000000 00000000 00000000 00000000 00000000
.N3.C3.R0: 18 00000000 00000000 00000000 00000000 00000 * 00 00000000 00000000
Запись в разряд 1 ... N3.C1.R3: -22 0000000 * 00000000 00000000 00000000 00000 * 00 00000000 00000000

Первая линия - идеальная линия и соответствует какому возврату. Мой Regex картина выглядит следующим образом:

string pattern = @"N\d\.C\d\.R\d:"; 

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

Имейте в виду, что приведенные выше примеры не являются исчерпывающим списком возможностей. Вот почему я пытаюсь использовать Regex вместо строковых методов.

Для справки, здесь подобные вопросы, которые я прочитал через, прежде чем спрашивать это одно:

Regex + Remove all text before match
RegEx Multple Matches in Text
Regex: Filter out text before last occurrence

EDIT: Я хотел бы отметить, что линии я работаю с являющимся очень маленькое подмножество информации, включенной в исходный файл. Все образцы строк, которые я опубликовал, являются примерами «хорошей» информации (то есть информации, которую я могу использовать), но первая строка - это то, как должен выглядеть конечный результат.

+0

Обрезать что! ...... показать нам ваш ожидаемый результат для ввода – Anirudha

ответ

2

Попробуйте следующее:

string str = Regex.Replace(input, @"(.+?)(N\d\.C\d\.R\d:)", "$2"); 
+1

Это решение будет работать, но я немного смущен, почему вы (spugm1r3) когда-нибудь захотите это сделать. Разве не лучше просто вернуть последнее совпадение в качестве результата без манипуляции с исходной строкой? – Ameen

+0

@ Согласен, более эффективно просто вернуть последний матч. – VladL

+0

Спасибо за быстрые ответы. Влад Л, ваш ответ прекрасен. @Ameen, честно говоря, я просто застрял внутри своей проблемы. Я никогда не использовал Regex перед этим проектом, и как только я наткнулся на образец, который работал «в основном», я только начал работать из этих результатов. Тем не менее, много синтаксиса в ответе Влада - это просто материал, который я еще не наткнулся или не понял. На эту заметку: Влад, можете ли вы объяснить $ 2? Очевидно, что это работает, я просто хочу знать механику этого, чтобы это не превратилось в «один» ответ для меня. – spugm1r3

0

Этот подход также возвращает то, что могло бы, возможно, следовать за свой последний матч (например, остаток строки после номера):

string pattern = @"^N\d\.C\d\.R\d:"; 
var matches = Regex.Matches(input, pattern, RegexOptions.Multiline); 
if (matches.Count > 0) { 
    string result = input.Substring(matches[matches.Count - 1].Index); 
} 

Я также включил ^ в порядке для поиска в начале строки явно. Для этого требуется опция регулярного выражения Multiline.

Смежные вопросы