У регулярному виразі, яким персонажам потрібно втекти?


23

Взагалі, які символи в регулярному виразі потребують втечі?

Наприклад, не синтаксично правильно:

echo '[]' | grep '[]'
grep: Unmatched [ or [^

Однак це синтаксично правильно:

echo '[]' | grep '\[]'
[]

Чи є будь-яка документація, на яку символи слід уникнути регулярного виразу, а які не слід?

Відповіді:


12

Це залежить від програми. У вашому прикладі [потрібно навести аргумент, grepале ні echo.

Для оболонки (від специфікації POSIX ):

Цитування використовується для видалення спеціального значення певних символів або слів до оболонки. Цитування можна використовувати для збереження буквального значення спеціальних символів у наступному абзаці, запобігання розпізнаванню зарезервованих слів як таких, а також запобігання розширенню параметрів та заміні команд у межах обробки документа тут (див. Тут-Документ).

У заяві потрібно вказати наступні символи, якщо вони повинні представляти себе:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

і за певних обставин, можливо, потрібно буде цитувати наступне. Тобто, ці символи можуть бути особливими залежно від умов, описаних у цьому томі IEEE Std 1003.1-2001:

*   ?   [   #   ˜   =   %

Різні механізми котирування - це символ втечі, одноцитати та подвійні лапки. Даний документ представляє іншу форму цитування; див. тут-Документ.

Конкретні програми (використовуючи регулярні вирази, perl, awk) можуть мати додаткові вимоги щодо втечі.


8

Кожна програма матиме свій набір "спеціальних" символів. Проблема, з якою ви зіткнулися, стосувалася grepне оболонки. Для яких персонажів потрібно цитувати grep, прочитайте розділ на сторінці "РЕГУЛЯРНІ ВИРАЗИ".

Для оболонки символи, які слід навести, є:

;'"`#$&*?[]<>{}\

і будь-який пробіл.

Залежно від оболонки, можуть бути також необхідні цитування інших символів:

!^%

Подивіться під "SHELL GRAMMAR" на сторінці шкаралупи.


У деяких оболонках з розширенням історії ( bashвключено) !все ще розгорнуто в подвійних лапках, лише окремі лапки зупиняють його розширення (або вимикають варіант оболонки).
Кріс Даун

]не слід цитувати, [не завжди. Я не знайшов жодних посилань на {і}
Маттео

8

Існує кілька типів регулярних виразів і набір спеціальних символів залежить від конкретного типу. Деякі з них описані нижче. У всіх випадках спеціальні символи уникають зворотної косої риски \. Наприклад, щоб відповідати [вам \[записом. Як варіант, символи (за винятком ^) можна уникнути, встановивши їх між квадратними дужками один за одним [[].

Символи, які є спеціальними в деяких контекстах, як ^особливі на початку (під-) вираження, можуть бути уникнуті у всіх контекстах.

Як писали інші: в оболонці, якщо ви не вкладаєте вираз між окремими лапками, вам доведеться додатково уникати спеціальних символів для оболонки у вже уникнутому регулярному виразі. Приклад: Замість цього '\['ви можете написати \\[(альтернативно: "\["або "\\[") в сумісних оболонках Bourne, як bash, але це вже інша історія.

Основні регулярні вирази (BRE)

  • POSIX: Основні регулярні вирази
  • Команди: grep,sed
  • Спеціальні символи: .[\
  • Спеціальні в деяких контекстах: *^$
  • Уникнути рядок: "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

Розширені регулярні вирази (ERE)

  • POSIX: розширені регулярні вирази
  • Команди:, grep -EGNU:, sed -r* BSD:sed -E
  • Спеціальні символи: .[\(
  • Спеціальні в деяких контекстах: *^$)+?{|
  • Уникнути рядок: "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"

3

grepвикористовує BRE як свій метод регулярного вираження. Існує гарна документація на нього тут , загальне короткий виклад було б «уникнути будь - яких спеціальних символів або метасимволу , щоб отримати його буквального, втеча , щоб створити керуючі послідовності ( \n, \rі т.д.)», хоча це не завжди так, наприклад, ви повинні втекти (і )отримати своє особливе значення (зворотній зв'язок).


0

Оболонка може перетворити командний рядок перед виконанням команди. І оболонка, і grepможе використовувати цитування, щоб видалити особливе значення деяких символів. Тим не менш, grepі снаряди мають різні особливі символи. Більше того, нерозроблені спеціальні символи, які не були результатом існуючого розширення, видаляються оболонкою перед виконанням команди.

echo '[]' | grep '[]'

Оболонка передає аргумент , []щоб grepі він обробляється як спотворене вираз кронштейна grep.

echo '[]' | grep \[]

Вище ми можемо побачити подібний випадок. Зворотна косою рисою видаляється і []передається як аргумент grep. grepрозпізнає вираз неправильної форми дужки.

echo '[]' | grep '\[]'

Нарешті, у цьому випадку лапки видаляються оболонкою і \[]передаються як аргумент, grepале в даному конкретному випадку ¹ \[інтерпретується grepяк буквальна дужка. Цитати потрібні для запобігання інтерпретації зворотної косої риси як оболонки спеціального символу.


¹ специфікація POSIX .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.