Узгодження спеціальних символів з регулярним виразом


10

Скажіть, що це дуже просто, якщо я хочу знайти щось, що містить малі літери та цифри

produce_text | grep -E '[0-9a-z]'

Дужки корисно відповідати набору символів, але як бути з тими, які є дещо особливими?
Якщо я хочу, скориставшись дужками, будь-який символ, окрім одного із них: дужка ], що закривається , тире (або дефіс) "-", обидві риски /та \, каре ^, двокрапка :.
Чи буде це виглядати так (я знаю, це не працює)?

[^] - / \ ^:]

Відповіді:


11

Для відповідності прямому ]та прямому -в Bracket Expression вам доведеться використовувати їх так:

[^]/\^:-]

або, ще краще, оскільки деякі інструменти вимагають уникнути зворотної косої риси :

[^]/\\^:-]

тобто
правильна квадратна дужка (']') втрачає своє особливе значення і представляє себе в дужковому виразі, якщо вона зустрічається спочатку в списку (після початкового '^', якщо такий є),
і
символ дефісу-мінусу повинен трактується як сама, якщо вона виникає першою (після початкового '^', якщо така є) або останньою у списку,
отже,
якщо вираз дужки вказує і '-' і ']', ']' ставиться першим (після '^', якщо така є) та остання '-' в межах дужки.
Правила для дужкових виразів однакові для ERE та BRE .


2
Я б подвоїв нахил, щоб бути на безпечній стороні. Це потрібно для багатьох awkреалізацій і, perlнаприклад.
Стефан Хазелас

Що про "Від карети до закриття дужки"? Як [^-]](Цей невдалий)?
iBug

2
@iBug - переконайтеся, що це не вдається, оскільки правильна дужка повинна бути першою, якщо ви хочете буквально відповідати. Я не впевнений , що я отримую точку цього «діапазон» , який ви згадуєте , як ^це після того, як ]так [^-]]не працюватиме , навіть якщо обидва ^і ]були оброблені в буквальному сенсі (як [b-a]). У будь-якому випадку, якщо ви хочете , щоб відповідати , наприклад , від ;до закриває дужка ви могли б використовувати діапазон до крупки перед тим ](що зворотний слеш) і включають в себе в ]якості першого символу в вираженні дужки так , наприклад [];-\\].
don_crissti

@don_crissti Про що [[.^.]-[.-.]]? У мене є відчуття, що це спрацює. Припустимо, що код ASCII ^є раніше -.
iBug

Отримав ледаче рішення мого питання. Просто [^[.].][.-.]/\^:]
перейдіть на

7

Як не дивно, вам потрібно мати пару символів у певних місцях. Ви повинні мати ]як першого символу в наборі, і він -повинен бути останнім символом у наборі.

Ось RE, який відповідає вашим вимогам [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4

1
Це не дуже дивно, просто потрібно уникати двозначності
Кевін

1
Другий [персонаж там не належить; ОП не хоче цього виключати.
Скотт

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