Вложенные группы в Regex - PullRequest
1 голос
/ 15 апреля 2010

Я строю регулярное выражение, которое ищет даты. Я хотел бы вернуть найденную дату и предложение, в котором она была найдена. В приведенном ниже коде строки по обе стороны от date_string должны проверять условия предложения. Ради вас, я опустил регулярное выражение для date_string - достаточно сказать, что он работает для выбора дат. Хотя внутренняя часть date_string не важна, она сгруппирована как одно целое регулярное выражение.

"((?:[^.|?|!]*)"+date_string+"(?:[^.|?|!]*[.|?|!]\s*))"

Проблема в том, что date_string соответствует только последнему номеру любой заданной даты, возможно потому, что регулярное выражение перед date_string совпадает слишком далеко и выходит за пределы регулярного выражения даты. Например, если я скажу «День независимости - 4 июля», я получу предложение и 4, хотя оно должно совпадать с «4 июля». Если вам интересно, мои регулярные выражения внутри date_string упорядочены таким образом, что «4 июля» должно совпадать первым. Есть ли способ сделать все это в одном регулярном выражении? Или мне нужно как-то разбить его (т.е. разбить весь текст на предложения, а затем проверить каждое предложение)?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2010

Есть несколько вещей не так с вашим регулярным выражением.

  1. В классах персонажей чередования нет. Вы хотите [^.?!], а не [^.|?|!].
  2. Вам вообще не нужны группы без захвата .
  3. Возможно, вам не нужна любая"внешняя" группировка, поскольку полное соответствие - это то, что вы ищете.
  4. Ваша часть совпадения, предшествующая дате, является жадной там, где ее не должно быть (это касается части вашей даты).
  5. Вы делаете предположения о том, что напоминает предложение, которое не соответствует действительности. Ваш собственный пример доказывает это, если вы попробуете.

Отложив последнюю точку на данный момент, вы получите следующую версию:

[^.?!]*?(July 4)[^.?!]*[.?!]\s*

Там, где буквальное выражение July 4 соответствует вашему регулярному выражению даты. Это соответствует в тексте вашего вопроса:

  1. ' For example, if I say "Independence Day is July 4.'
  2. '", I will get the sentence and 4, even though it should match 'July 4'. '

, что в значительной степени подтверждает мою точку зрения № 5.

2 голосов
/ 15 апреля 2010

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

[^.?!]*?

И да, разбиение текста на предложения (предпочтительно исключая последний символ) действительно облегчит задачу.

(Похоже, я не смотрел на то, что было в классе персонажей. Заменил его на тлофлина.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...