Регулярное сравнение - PullRequest
       18

Регулярное сравнение

4 голосов
/ 01 августа 2009

Я (наконец-то) начинаю изучать регулярные выражения, и мне интересно, есть ли заметная разница между этими двумя строками шаблонов. Я пытаюсь сопоставить строки, такие как "Title=Blah", и сопоставить "Заголовок" и "Бла" в двух группах.

Проблема возникает с заголовками типа "Title=The = operator". Вот два варианта решения проблемы:

^([^=]+)=(.+)$
^(.+?)=(.+)$

Есть ли какая-либо разница между ними, с точки зрения производительности или функциональности?

Ответы [ 5 ]

5 голосов
/ 01 августа 2009

Первый требует, чтобы был хотя бы один не = символ перед =, чтобы соответствовать, в то время как второй нет; это будет соответствовать ведущему ==.

Что касается производительности, я не ожидаю значимой разницы, но если вам действительно все равно, единственное, что нужно сделать, - это профилировать ее. Что я и сделал бы, написав пару сценариев, каждый из которых выполнял один из методов несколько сотен тысяч раз, и синхронизировал их с помощью команды Unix time.

3 голосов
/ 01 августа 2009

Первый требует наличия хотя бы одного не = символа перед an =, чтобы соответствовать, тогда как второй нет; это будет соответствовать ведущему ==.

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

Альтернатива лени
В этом случай, есть лучший вариант, чем делая плюс ленивым. Мы можем использовать жадный плюс и отрицательный характер класс: <[^ =] +>. Причина, почему это лучше из-за возврата. При использовании ленивого плюса, двигатель должен вернуться для каждого символа в HTML-тег, который он пытается матч. При использовании отрицания класс персонажа, без возврата происходит вообще, когда строка содержит действительный код HTML. Откат замедляется вниз двигатель регулярных выражений. Ты не будешь обратите внимание на разницу при выполнении одиночный поиск в текстовом редакторе. Но вы сэкономите много циклов процессора при использовании такого регулярного выражения в плотный цикл в сценарии, который вы писать ...

1 голос
/ 01 августа 2009

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

1 голос
/ 01 августа 2009

Что касается производительности, то она (в теории) будет зависеть от того, какую реализацию регулярного выражения вы используете. Хотя здесь, вероятно, дело обстоит иначе, между реализациями могут возникнуть глубокие различия для проблемных регулярных выражений. Например, регулярное выражение a?a?a?aaa, примененное к строке, состоящей из N "a" s, имеет сложность O(N**3) с использованием типовых (то есть основанных на DFA) движков регулярных выражений.

Для получения дополнительной информации обратитесь к: " Сопоставление регулярных выражений может быть простым и быстрым (но медленно в Java, Perl, PHP, Python, Ruby, ...)"Расс Кокс.

0 голосов
/ 01 августа 2009

Запуск обоих против '==test'

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