Точка в RegEx опасна

У меня сложилось впечатление, что точка '.' (wild card) символ опасно использовать. Мои опасения необоснованны? Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 805
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Натрий опасен, но он необходим для жизни. Dot похож на любой другой инструмент, только настолько опасен, насколько вы его делаете. Мне бы очень не хотелось писать без него 99% моих регулярных выражений.

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

Ответ принят как подходящий

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

От учебник по регулярным выражениям

Точка соответствует одному символу, не заботясь о том, что это за символ. Единственное исключение - символы новой строки.

В большинстве разновидностей регулярных выражений точка по умолчанию не соответствует символу новой строки. Таким образом, по умолчанию точка является сокращением от отрицательного класса символов [^ \ n] (разновидности регулярных выражений UNIX) или [^ \ r \ n] (разновидности регулярных выражений Windows).

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

Я бы не сказал «опасно», по крайней мере, в целом. Тем не мение:

  • . * следует по возможности избегать, потому что это может убить производительность вашего регулярного выражения из-за большого количества возвратов, поскольку оно пытается найти лучшее совпадение, и, если токен, который идет после него, появляется во входных данных более одного раза, вы, вероятно, не получите совпадение, которое вы хотели, потому что оно ищет максимально возможное совпадение. . *? помогает с проблемой возврата и устраняет проблему «слишком длинного соответствия», но не использует. вообще имеет тенденцию быть более эффективным.

  • Потому что . может соответствовать чему угодно (кроме, как правило, конца строки), может совпадать с тем, чего вы не планировали / не ожидали. В контексте безопасности это может быть опасно.

Это зависит от использования. .* отлично подходит, например, для поиска файлов. Это может быть плохо, если у вас есть такое регулярное выражение:

.*<one>.*<two>.*<three>.*</three>.*</two>.*</one>.*

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

Не забывайте, что вы часто можете использовать [^x]* вместо .*?x. Последний может потреблять x, если необходимо, чтобы завершить матч, но первый не может. Файл. более вероятно, что это будет опасно, если вашему регулярному выражению разрешено сопоставлять многострочные строки с. может представлять новую строку. В любом случае, вам стоит беспокоиться только тогда, когда вы используете .* или .*?, хотя есть много случаев, когда вы этого захотите. .{0,10} и подобные менее склонны к тому, чтобы ваше регулярное выражение начинало работать абсурдно медленно.

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

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

VonC опередил меня, указав на моя статья. Раздел «экономно используйте точку» отвечает на ваш вопрос.

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

Ух ты ... Мистер "Мастер регулярных выражений";) 9,99 из десяти, я всегда спешу на ваш сайт, чтобы задать любой вопрос по регулярному выражению. Спасибо, что помогли нам лучше понять эти хитрые выражения.

VonC 24.11.2008 22:18

Верно. Я ценю всю вашу работу, которую вы проделали, помогая объяснить сложности RegEx. Продолжайте хорошую работу.

Brig Lamoreaux 26.11.2008 05:24

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