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





Натрий опасен, но он необходим для жизни. Dot похож на любой другой инструмент, только настолько опасен, насколько вы его делаете. Мне бы очень не хотелось писать без него 99% моих регулярных выражений.
Это не опасно, если вы понимаете, что это значит. Обычно он соответствует любому символу входящего текста. В зависимости от вида регулярных выражений он может соответствовать или не соответствовать символам конца строки.
Единственная сложная часть, которую я вижу для '.' это при сопоставлении многострочной строки: с неправильными параметрами она может соответствовать гораздо большему количеству, чем необходимо, и может вызвать проблему отслеживания (из-за нежадного сопоставления).
От учебник по регулярным выражениям
Точка соответствует одному символу, не заботясь о том, что это за символ. Единственное исключение - символы новой строки.
В большинстве разновидностей регулярных выражений точка по умолчанию не соответствует символу новой строки. Таким образом, по умолчанию точка является сокращением от отрицательного класса символов [^ \ n] (разновидности регулярных выражений UNIX) или [^ \ r \ n] (разновидности регулярных выражений Windows).
Это исключение существует в основном по историческим причинам. Первые инструменты, в которых использовались регулярные выражения, были линейными. Они будут читать файл построчно и применять регулярное выражение отдельно к каждой строке. Эффект состоит в том, что с этими инструментами строка никогда не может содержать новые строки, поэтому точка никогда не сможет соответствовать им.
Я бы не сказал «опасно», по крайней мере, в целом. Тем не мение:
. * следует по возможности избегать, потому что это может убить производительность вашего регулярного выражения из-за большого количества возвратов, поскольку оно пытается найти лучшее совпадение, и, если токен, который идет после него, появляется во входных данных более одного раза, вы, вероятно, не получите совпадение, которое вы хотели, потому что оно ищет максимально возможное совпадение. . *? помогает с проблемой возврата и устраняет проблему «слишком длинного соответствия», но не использует. вообще имеет тенденцию быть более эффективным.
Потому что . может соответствовать чему угодно (кроме, как правило, конца строки), может совпадать с тем, чего вы не планировали / не ожидали. В контексте безопасности это может быть опасно.
Это зависит от использования. .* отлично подходит, например, для поиска файлов. Это может быть плохо, если у вас есть такое регулярное выражение:
.*<one>.*<two>.*<three>.*</three>.*</two>.*</one>.*
По причинам, указанным другими людьми, в зависимости от того, что находится между этими скобками, это может вызвать много откатов и быть очень медленным.
Не забывайте, что вы часто можете использовать [^x]* вместо .*?x. Последний может потреблять x, если необходимо, чтобы завершить матч, но первый не может. Файл. более вероятно, что это будет опасно, если вашему регулярному выражению разрешено сопоставлять многострочные строки с. может представлять новую строку. В любом случае, вам стоит беспокоиться только тогда, когда вы используете .* или .*?, хотя есть много случаев, когда вы этого захотите. .{0,10} и подобные менее склонны к тому, чтобы ваше регулярное выражение начинало работать абсурдно медленно.
По сути, точка не опасна, но люди склонны слишком полагаться на нее. На самом деле, некоторое время назад мне пришло в голову, что хороший способ улучшить свои навыки регулярного выражения - это прекратить использовать точку - или, по крайней мере, попытаться использовать ее как можно реже. Это заставит вас задуматься о том, как работает сопоставление регулярных выражений, и изучить другие, более продвинутые функции, которые вы никогда не удосужились изучить.
Как и в случае со многими другими инструментами, легко застрять на среднем уровне регулярных выражений и никогда не овладеть ими. Мне кажется, это хороший способ перетянуть себя через этот горб. Учтите, что я не говорю, что вам больше никогда не следует использовать точку. просто дайте ему отдохнуть на несколько месяцев, пока вы узнаете, что еще могут предложить регулярные выражения.
VonC опередил меня, указав на моя статья. Раздел «экономно используйте точку» отвечает на ваш вопрос.
Проблема не в точке. Проблема в том, что люди используют его в ситуациях, когда это неуместно.
Верно. Я ценю всю вашу работу, которую вы проделали, помогая объяснить сложности RegEx. Продолжайте хорошую работу.
Ух ты ... Мистер "Мастер регулярных выражений";) 9,99 из десяти, я всегда спешу на ваш сайт, чтобы задать любой вопрос по регулярному выражению. Спасибо, что помогли нам лучше понять эти хитрые выражения.