Regex: ленив хуже?

просто удалите «/» после диска, и он отлично работает.

То есть от drive.mount ('/ content / drive /') до drive.mount ('/ content / drive')

12
задан AndersTornkvist 24 October 2011 в 21:38
поделиться

6 ответов

Другая вещь рассмотреть состоит в том, какой длины целевой текст, и сколько из него будет подобранным определенным количественно подвыражением. Например, если бы Вы пытались соответствовать целому <ТЕЛО> элемент в большом документе HTML, то Вы могли бы испытать желание использовать этот regex:

/<BODY>.*?<\/BODY>/is

Но это собирается сделать большую ненужную работу, соответствуя одному символу за один раз, эффективно делая отрицательное предвидение перед каждым. Вы знаете </ТЕЛО>, тег будет очень около конца документа, таким образом, умная вещь сделать состоит в том, чтобы использовать нормальный жадный quantitier; позвольте ему хлебать целый отдых документа и затем отследить в обратном порядке несколько символов, необходимых для соответствия конечному тэгу.

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

12
ответ дан 2 December 2019 в 04:43
поделиться

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

Не жадный regex будет соответствовать вещам, как которые Вы, вероятно, не хотите, такие:

<A HREF="foo" NAME="foo" TARGET="_blank">foo</A>

где Ваше первое.*? соответствия

foo" NAME="foo
8
ответ дан 2 December 2019 в 04:43
поделиться

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

Помимо различия в значении, единственный недостаток, о котором я могу думать, - то, что поддержка нежадных модификаторов не вполне так распространена, как отрицание класса символов. Это более широко поддерживается, чем я думал, прежде чем я проверил, но особенно отсутствуйте на списке, GNU Grep. Если средства анализа регулярного выражения, которые Вы используете, поддерживают его, то идут вперед и используют его.

7
ответ дан 2 December 2019 в 04:43
поделиться

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

3
ответ дан 2 December 2019 в 04:43
поделиться

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

1
ответ дан 2 December 2019 в 04:43
поделиться

Нежадный лучше, это нет? Это работает вперед, проверяя на соответствие каждый раз и останавливаясь, когда это находит один, тогда как нормальное закрытие Клини (*) работает назад соответствие остальной части входа и удаления вещей, пока это не находит соответствие.

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

1
ответ дан 2 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: