Сбой регулярного выражения .Net aspnet_wp.exe - PullRequest
1 голос
/ 05 мая 2009

У меня возникла следующая проблема, и я подумал, может ли кто-нибудь понять, почему это приводит к сбою моего рабочего процесса .net (aspnet_wp.exe):

  Dim pattern As String = "\{\{IF\(((?!\)}})(.))+,,,((\s)*(?!\)}})(.))+\)}}"
  Dim mc As RegularExpressions.MatchCollection = Regex.Matches(txtContent.Text, pattern)

Работает абсолютно нормально, если найдено совпадение, например,

<h3>Title</h3>
<p>Top paragraph.</p>

{{IF(1=2,,, <p></p>)}}

Но если совпадения не найдены, кажется, что мой процессор затягивается и работает довольно долго, например, если последняя скобка отсутствует перед последними двумя фигурными скобками:

<h3>Title</h3>
<p>Top paragraph.</p>

{{IF(1=2,,, <p></p>}}

Это слишком жадный, что он ищет вечно !? Спасибо!

1 Ответ

3 голосов
/ 05 мая 2009

Проблема легко идентифицируется: «Катастрофический возврат» .

Каждый раз, когда вы видите феномен "если совпадение существует, оно срабатывает, если совпадения не существует, оно занимает вечность", вы можете быть уверены, что причина.

Я предлагаю другое регулярное выражение, которое делает меньше возврата. Атомная группировка может помочь свести к минимуму количество шагов для возврата:

Dim pattern As String = "\{\{IF\((?>(?:(?!,,,).)+),,,(?>(?:(?!\)\}\}).)+)\}\}"
Dim mc As RegularExpressions.MatchCollection = Regex.Matches(txtContent.Text, pattern)

Шаблон (не знаю, буду ли я записывать все, что вам нужно - добавьте скобки там, где считаете нужным):

\{\{IF\(                # "{{IF("
(?>(?:(?!,,,).)+)       # atomic group: any char up to the ",,,"
,,,                     # ",,,"
(?>(?:(?!\)\}\}).)+)    # atomic group: any char up to the ")}}"
\)\}\}                  # ")}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...