Как это регулярное выражение делит текст на предложения? - PullRequest
1 голос
/ 30 сентября 2010

Я знаю, что это регулярное выражение делит текст на предложения.Может кто-нибудь помочь мне понять, как?

/(?<!\..)([\?\!\.])\s(?!.\.)/

Ответы [ 5 ]

14 голосов
/ 30 сентября 2010

Можно использовать YAPE :: Regex :: Explain для расшифровки регулярных выражений Perl:

use strict;
use warnings;
use YAPE::Regex::Explain;

my $re = qr/(?<!\..)([\?\!\.])\s(?!.\.)/;
print YAPE::Regex::Explain->new($re)->explain();

__END__

The regular expression:

(?-imsx:(?<!\..)([\?\!\.])\s(?!.\.))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (?<!                     look behind to see if there is not:
----------------------------------------------------------------------
    \.                       '.'
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )                        end of look-behind
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [\?\!\.]                 any character of: '\?', '\!', '\.'
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  \s                       whitespace (\n, \r, \t, \f, and " ")
----------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
    \.                       '.'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
5 голосов
/ 30 сентября 2010

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

2 голосов
/ 30 сентября 2010

Первая часть (?<!\..) - негативный взгляд.Он определяет шаблон, который делает недействительным совпадение.В этом случае он ищет двух персонажей - первый - точку, а другой - любой персонаж.

Вторая часть - это стандартный захват / группа, которая может быть лучше выражена: ([?!.]) (вам не нужны экранированные символы в скобках класса), то есть окончание предложениясимвол пунктуации.

Следующая часть - это одиночный ( ?? ) символ пробела: \s

И последняя частьнегативный прогноз: (?!.\.).Опять же, он защищает от случая одного символа, за которым следует точка.

Это должно работать, относительно хорошо.Но я не думаю, что рекомендую это.Я не понимаю, к чему стремился кодер, пытаясь убедиться, что просто точка не была вторым самым последним персонажем или что он не был вторым.

Я имею в виду, если вы хотите разбить на пунктуацию терминалов, почему бы вам не принять меры против того, чтобы один и тот же класс был впереди или сзади?Вместо этого он полагается на периоды, которых там нет.Таким образом, более регулярное выражение будет:

/(?<![?!.].)([?!.])\s(?!.[?!.])/
2 голосов
/ 30 сентября 2010
(?         # Find a group (don't capture)
<          # before the following regular expression
!          # that does not match
\.         # a literal "."
.          # followed by 1 character
)          # (End look-behind group)
(          # Start a group (capture it to $1)
[\?\!\.]   # Containing any one of the characters in the following set "?!."
)          # End group $1
\s         # followed by a whitespace character " ", \t, etc.
(?         # Followed by a group (don't capture)
           # after the preceding regular expression
!          # that does not have
.          # 1 character
\.         # followed by a literal "."
)          # (End look-ahead group)
0 голосов
/ 30 сентября 2010

Порции:

  • ([\?\!\.])\s: разделить на конечный символ (., ! или ?), за которым следует пробельный символ (пробел, табуляция, символ новой строки)
  • (?<!\..), где символы перед этим «конечным символом» не являются . + что-либо
  • (?!.\.) после символа пробела любой символ, за которым сразу следует любой ., не являетсяпозволено.

Эти предварительные ((?!) и прогнозные ((?<!) утверждения, по-видимому, в основном предотвращают разбиение на (пробел?) сокращения (q. e. d. и т. д.).

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