2009-07-27 2 views
0

Прошло некоторое время с тех пор, как я использовал регулярные выражения, и я надеюсь, что то, что я пытаюсь сделать, возможно. У меня есть программа, которая отправляет автоматический ответ на конкретный файл, и я хотел бы захватить текст между двумя словами, которые я знаю, никогда не изменится. В данном примере эти слова «о» и «послал»Использование регулярных выражений для получения слова между двумя ключевыми словами

Dim subject As String = "Information regarding John Doe sent." 
Dim name As String = Regex.IsMatch(subject, "") 

Так что в этом случае я хотел бы быть в состоянии получить только «John Doe». Каждое регулярное выражение, которое я придумываю, включает слова «относительно» и «отправлено». Как я могу использовать эти слова в качестве границ, но не включать их в матч?

ответ

3

Предполагая "Information regarding " и "sent." никогда не изменится, вы можете использовать захвата группы, чтобы получить "John Doe":

^Information regarding (.+) sent.$ 

И вы используете это так:

Dim regex As New Regex("^Information regarding (.+) sent.$") 
Dim matches As MatchCollection = regex.Matches(subject) 

Теперь, он должен соответствовать только один раз, и вы можете получить группу из свойства Группы в матче:

For Each match As Match In matches 
    Dim groups As GroupCollection = match.Groups 
    Console.WriteLine(groups.Item(1).Value) // prints John Doe 
Next 
+2

Эта последняя строка должна быть 'Console.WriteLine (groups.Item (1) .Value)' - group # 0 - это полное совпадение, а группа # 1 - первая группа захвата (в скобках). –

+0

@Alan M: Хорошая добыча. Я обновил свой ответ. Большое спасибо. – Welbog

0

Вашего регулярное выражение должно существенно выглядеть следующим образом:

.*regarding (.+) sent.* 

И данные, которые вы ищете будут в первом переменном захвате ($ 1 в Perl).

0

Согласование всех групп - это способ сделать, я бы использовал две несоответствующие группы и одну именованную группу, чтобы она возвращала только ту группу, которую вы хотели. Это даст вам регулярное выражение:

(?:regarding)(?<filename>.*)(?: sent) 

это даст вам возможность назвать имя файла из групп, например

Dim rx As New Regex("(?:regarding)(?<filename>.*)(?: sent)", _ 
      RegexOptions.Compiled) 
Dim text As String = "Information regarding John Doe sent." 
Dim matches As MatchCollection = rx.Matches(text) 
'The lazy way to get match, should print 'John Doe' 
Console.WriteLine(matches[0].Groups.Item("filename").Value) 

Хороший ресурс для Regex найден на сайте MSDN here

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