Regexp один или несколько против n+1 соответствия

Я обнаружил, что замена регулярного выражения в моем go-проекте была невероятно медленной, \s+ заменялся одним пробелом с использованием regexp.ReplaceAllLiteralString (re2).

Очевидно, он был помещен туда, чтобы свернуть пробелы в SVG, независимо от того, если это хорошая идея, при изменении на {2,} операция выполняется в 1 десятую раза.

Хотя использование \s vs ' ' - большая разница, но это имеет смысл, это в 5 раз больше сравнений. Но почему при использовании одного пробела и + он в 9 раз медленнее, чем с {2,}?

1 ответ

X+ означает "каждый экземпляр X, который происходит один или несколько раз", что означает, что это эквивалентно {1,}, Вы заменяете (один пробел), а также       когда используешь \s+,

Для документа SVG или любого документа XML по этому вопросу, используя \s+ должен быть медленным. Следующий документ потребует 5 замен, игнорируя последовательности новой строки:

<?xml version="1.0" encoding="utf-8"?>
<element attr1="value" attr2="value" attr3="value"/>

Теперь представьте себе SVG-документ, который намного сложнее, и разумно, что-то вроде \s{2,} будет намного быстрее, чем \s+ (ака \s{1,})! Там будет 0 замен в документе выше, если вы использовали \s{2,}!

Другие вопросы по тегам