Здравствуйте, hl-man, Вы писали:
PAS>>Possessive quantifiers сделает тоже самое и быстрее.
HM>Гм... Возможно. По правде говоря я не очено то в них "въехал", потому и задействовал атомарные группы
Надо изучить вопрос.
Расчёт на то, что если ты встретил незакодированный символ, то с очень большой вероятностью следующий символ тоже будет не закодирован. То же самое с "процентными" группами. Так что имеет смысл выбирать сначала повторения, без необходимости обращаться к |.
Есть три нотации повторений:
Жадные –
.+ – сначала отбирают всё что могут, потом, если нужно, потихоньку отдают символы строке назад (бектрекинг)
/<.+>/.exec("Some <tag>text</tag> here")
Ленивые –
.+? – стараются как можно быстрее перескочить на последующую часть RegExp
/<.+?>/.exec("Some <tag>text</tag> here")
Притяжательные (Possessive quantifiers) –
.++ – работает как жадный алгоритм, но не сохраняет инфо для бектрекинга.
/<.++>/.exec("Some <tag>text</tag> here") – не найдёт ничего, так как в .++ попадёт всё до конца строки и символ ">" не сможет быть найден, а поскольку информации о бектрекинге нет, то соответственно регулярка не тратит время на него и сразу фейлиться.
/<[^>]++>/.exec("Some <tag>text</tag> here") – это быстрый способ поиска (без бектрекинга) со взаимоисключающими условиями.