2015-07-19 5 views
5

Возможны ли дополнительные группы, не захватывающие захват?Неустранимые группы не захватили?

Является ли следующее регулярное выражение:

(?:wo)?men 

семантически эквивалентно следующему регулярному выражению?

(wo)?men 
+0

Я думаю, что это будет зависеть от того, где вы используете регулярное выражение. Стандартные строки регулярных выражений Java могут потребовать этого, хотя я уверен, что Perls будет считать его избыточным. – thecoshman

+4

группы, не связанные с захватом, тяжелы на процессоре (так как для этого требуется дополнительная обработка), в то время как группы захвата тяжелы в памяти (так как они должны хранить много вещей). Но они семантически эквивалентны в некотором смысле, что они могут совпадать с одной и той же вещью, но по-другому. Вы можете думать, что это автомобили с разными двигателями, но оба они служат средством езды. –

ответ

7

Ваш (?:wo)?men(wo)?men и семантически эквивалентны, но технически различаются, а именно, первый используется не захват, а другой группе захвата. Таким образом, вопрос , почему использовать не-захватить группы, когда у нас есть захват?

Неопасные группы иногда помогают.

  1. Для того, чтобы избежать чрезмерного количества обратных ссылок (помните, что иногда бывает трудно использовать обратные ссылки выше, чем 9)
  2. Для того, чтобы избежать проблемы с 99 пронумерованной предела обратные_связи (за счет уменьшения числа пронумерованных захвата групп) (источник : Regular-expressions.info: Большинство ароматизаторов регулярных выражений поддерживают до 99 групп захвата и двухзначных обратных ссылок.)
    ПРИМЕЧАНИЕ это не относится к механизму Java regex, а также к механизмам регулярного выражения PHP или .NET.
  3. К lessen the overhead, вызванным хранением захватов в стеке
  4. Мы можем добавить больше группировок в существующее регулярное выражение, не разрушая порядок захвата групп.

Кроме того, это просто makes our matches cleaner:

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

Это не кажется хорошей идея, чтобы повторно-фактор существующего регулярных выражений для преобразования захвата для не захвата групп, так как may ruin the code или требуют слишком много усилий.

+0

Этот комментарий больше подходит для редактирования, вам не кажется? –

+2

Просто обратите внимание, что ограничение 99 обратной ссылки не относится к Java regex engine. Количество групп захвата в Java хранится в * transient int captureGroupCount *, поэтому теоретически может быть много обратных ссылок, но число может быть ограничено ограничениями памяти. –

+0

Я пытаюсь найти, сколько накладных расходов мы говорим и какое влияние это имеет на самом деле (Java и Javascript). Есть ли реальная польза в использовании групп, не связанных с захватом, с точки зрения производительности? – runlevel0