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,}
!