2012-01-12 3 views
6

Я пытаюсь найти способ удалить весь текст в строке перед совпадением в Regex. Я кодирую это на C#.Regex + Удалить весь текст перед матчем

Например, если строка «hello, test matching», а шаблон «test», я бы хотел, чтобы конечный результат был «сопоставлением тестов» (т.е. удаляем все перед тестированием).

Любые мысли? Благодаря!

EDIT: Я, вероятно, должен был быть более конкретным в моем примере после прочтения ваших ответов (и спасибо за них). Мне нравится метод lookahead, но я упростил свой пример. Для того, чтобы сделать вещи более трудным, как правило, строки выглядят как:

«Привет, тест соответствия тест everythingAfter»

Так что, если я использую шаблон «тест», он будет ловить первый. Какова моя цель - заменить весь текст после второго матча. Т.е.: результат в "test everythingAfter" .... Извините.

+2

Я не достаточно знаком с C#, чтобы написать код. Однако не используйте RegEx, используйте базовые строковые методы. * поиск *, чтобы найти возникновение, чем использовать * подстроку * capture * все после *. –

+0

Для шаблонов, которые вы пытаетесь удалить, всегда ли они строки или они иногда являются действительными регулярными выражениями? Если первое, используйте 'IndexOf' и' Substring' и избегайте штрафных санкций, которые вам не нужны. –

+0

Возможный дубликат: [Удалить текст из строки до тех пор, пока не достигнет определенного символа] (http://stackoverflow.com/q/8371922/299327) –

ответ

0

* Обновленный, используя matchcollection

string test = "hello, test matching"; 

string regexStrTest; 
regexStrTest = @"test\s\w+";  
MatchCollection m1 = Regex.Matches(test, regexStrTest); 
//gets the second matched value 
string value = m1[1].Value; 
+0

см. Править (и комментарий) выше – keynesiancross

+0

Это * lookbehind *, а не взгляд, и он ничего не полезен. Если '' test \ s "' только что потреблял 'test', за которым следует пробел, то, конечно, lookbehind для' 'test" 'будет успешным. Кроме того, опция «Singleline» не действует, потому что метасимвол '.' не используется в регулярном выражении. –

+0

Обновлено! Решение решает вопрос. – Standage

5

Для простого решения, просто заменить «запуск производственной линии ничего тест» с «тестом»:

newString = Regex.Replace(oldString, "^.*test", "test"); 

С * жадно, это будет заменить как можно больше, т.е. a test b test c станет test c. Чтобы заменить как можно меньше, используйте *? вместо *.

Если вы хотите, чтобы избежать дублирования слово для поиска, вы можете использовать Zero-width positive lookahead assertion:

newString = Regex.Replace(oldString, "^.*(?=test)", ""); 
+0

Это приведет к удалению всего до * последнего * совпадения 'test'. Во многих случаях это может не иметь значения, но это тоже может ввести в заблуждение. – svick

+0

На самом деле, когда я читаю ответы сейчас, это именно то, что мне нужно сделать (см. Мое редактирование выше). Мне нужно, чтобы он соответствовал последнему результату, и заменил все до него. Большое спасибо. – keynesiancross

+0

@keynesiancross: Если это так, вы должны принять этот ответ или один из Хайнци, * не * Пол. Ничего личного, Пол, но тот работает только случайно. –

7

Вы можете использовать positive lookahead, чтобы соответствовать строке, но не захватить его:

(?=test) 

Так что вы хотите для сбора материала до последнего испытания:

^.*(?=test) 

Если вы хотите сделать это так, что это первое появление теста, использовать ленивое соответствие:

^.*?(?=test) 
+0

Thx для ответа - сделал редактирование проблемы выше ... Мне нравится этот подход с учетом взглядов. Могу ли я выбрать второй матч, а затем посмотреть в будущее? – keynesiancross

+0

как бы вы захватили все после появления? – user1040975

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