Мне было интересно, существуют ли какие-либо общие рекомендации по использованию regex VS "string".contains("anotherString")
и/или другим вызовам String API?Рекомендации по работе с регулярными выражениями VS sheer iteration
Хотя вышеописанное решение для .contains()
тривиально (зачем беспокоиться о регулярном выражении, если вы можете сделать это за один раз), реальная жизнь приносит более сложные варианты. Например, лучше ли делать два вызова .contains()
или одно регулярное выражение?
Мое правило состоит в том, чтобы всегда использовать регулярное выражение, если только это не может быть заменено одним вызовом API. Это предотвращает разрастание кода, но, вероятно, это не так хорошо с точки зрения удобочитаемости кода, особенно если регулярное выражение имеет тенденцию становиться большим.
Другим, часто упускаемым из виду аргументом является производительность. Как узнать, сколько итераций (как в «Big O») требуется для этого регулярного выражения? Будет ли это быстрее, чем простое повторение? Почему-то все предполагают, что если регулярное выражение выглядит короче, чем 5 if
, то оно должно быть быстрее. Но всегда ли это так? Это особенно важно, если регулярное выражение не может быть предварительно скомпилировано заранее.
Ваш ответ не имеет никакого смысла. Регулярное выражение this |, которое выполняет один линейный поиск по строке, с небольшим количеством дополнительной логики, когда встречается «th», останавливаясь при первом совпадении того или другого. Выполнение двух вызовов contains() выполняет два линейных поиска по строке, требуя поиска полной строки, если она не содержит первого слова. Это всегда будет иметь худшую производительность. . * это. * |. * это. *, безусловно, не будет оптимизироваться лучше, чем намного проще этого, потому что исходный. * соответствует всей строке до конца, а затем отскакивает, чтобы найти слова. –
Худшие случаи одинаковы в любом случае, каждый образец будет проверяться в каждой соответствующей позиции символа. Для нескольких прямых матчей я согласен, что «это |, что» имеет более оптимальные случаи (например, «это» происходит в строке, но не «это»). По мере роста списка шаблонов и возрастания шансов ложных запусков он меняется. В этом случае я, вероятно, не подхожу. Прямые литеральные совпадения всегда могут выступать за регулярное выражение (хотя конкретная реализация Java, по-видимому, выполняется неспешно для нескольких сотен моделей из опыта). – PSpeed
Для нелитературных шаблонов, где само сопоставление стоит дорого, он может заплатить за выполнение нескольких отдельных операций вместо одного большого регулярного выражения ... особенно, если вам неинтересно раннее совпадение (по положению). – PSpeed