Не вдається уникнути зворотної косої риски з допомогою регулярного виразу


114

Я використовую наступний регекс

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Я знаю, що це некрасиво, але поки він служить своєму призначенню, крім того, що зворотна косої риски не дозволяється, як я думаю, що це повинно, тому що вона втекла, я також намагалася \\замість, \\\але таких же результатів. Якісь ідеї?


4
Я щойно зафіксував друкарську помилку в заголовку, але є щось глибоко приголомшливе у заголовку "Не вдається уникнути зворотного зв'язку з регулярним виразом?" Справді!
Адам Кросленд

1
@AdamCrossland Чи не всі ми хочемо, щоб регекс міг допомогти нам уникнути люфтів? > _>
Ітон Б.

2
Чорт забираю, я просто хочу, щоб я міг уникнути люфту ВІД регексу.
Адам Кросленд

Відповіді:


226

Якщо ви ставите це в рядку в рамках програми, можливо, вам потрібно буде використовувати чотири зворотні косої риски (оскільки аналізатор рядків видалить два з них, коли "де-ухиляється" від нього для рядка , і тоді для регулярного вираження потрібно два для уникнув зворотній кут регулярного вирівнювання).

Наприклад:

regex("\\\\")

трактується як ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

трактується як ...

regex(\\)

інтерпретується як регулярний вираз, який відповідає одному зворотному рису.


Залежно від мови, ви можете використовувати іншу форму цитування, яка не розбирає послідовності втечі, щоб уникнути необхідності використання стільки - наприклад, у Python:

re.compile(r'\\')

rУ передній частині лапок роблять його сирої рядком , яка не виконує жодних зворотний слеш.


14
хе-хе ... я просто наткнувся на це і мені потрібно було додати три. Я просто продовжував додавати риски, поки це не спрацювало.
billynoah

гмм, чому на землі цей регекс повторно трактується замість одного разу, як це має бути для PCRE?
Джим Майклз

3
@JimMichaels тому, що не всі мови мають незмінені літерали регулярного виразів, і, таким чином, іноді мова програмування сама інтерпретує слэш-біг один раз у своєму рядковому синтаксисі, і отримана рядок потім передається в механізм регулярних виразів (який інтерпретує слэш-втечі в синтаксис регексу).
Бурштин

1
одного разу, давно мені довелося захоплювати xpath елемента, єдиною ідентифікаційною особливістю якого був шлях до файлу Windows, а потім генерувати програму (як рядок), у якій xpaths представлятимуться як рядки. в один момент на проміжних щаблях було 8 зворотних косих рис, які використовувались для представлення одного зворотного косого кута в шляху до файлу. Це найвище, що я коли-небудь отримував.
Заккеньон

Це може стати ще більш перекрученим при пошуку зворотних нахилів разом із візерунками, для яких потрібні метасимволи. Візьмемо, наприклад, знаходження зворотної косої риски з наступною цифрою. Тепер ви б дивилися на такий вираз , намагаючись з'ясувати , що відбувається: new RegExp('\\\\\\d');.
jabacchetta

15

Якщо це не буквально, ви повинні використовувати \\\\так, щоб ви отримали, \\що означає уникнутий нахил.

Це тому, що є два уявлення. У рядковому представленні вашого регулярного виразу ви маєте "\\\\": Що саме надсилається в парсер. Аналізатор побачить, \\що він трактує як дійсний відхилений зворотний кут (який відповідає одному зворотному косому рису).


10

Зворотна косою рисою \є символ втечі для регулярних виразів. Тому подвійний кут нахилу дійсно означатиме єдиний, буквальний зворотний кут.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

посилання: http://www.regular-expressions.info/reference.html


4

Від http://www.regular-expressions.info/charclass.html :

Зауважте, що єдиними спеціальними символами або метахарактерами всередині класу символів є дужка закриття (]), зворотна косої риски (\\), карета (^) та дефіс (-). Звичайні метахарактеристики - це звичайні символи всередині класу символів, і їх не потрібно уникати зворотною косою рисою. Щоб шукати зірку чи плюс, використовуйте [+ *]. Ваш регулярний вираз буде добре працювати, якщо ви уникнете звичайних метахарактерів всередині класу символів, але це значно знизить читабельність.

Щоб включити зворотну косу рису як символ без особливого значення всередині класу символів, вам слід уникнути його з іншим нахилом. [\\ x] збігається з косою рисою або x. Кронштейн, що закриває (]), карету (^) та дефіс (-), можна включати, уникаючи їх із зворотною косою рисою, або ставлячи їх у положення, де вони не приймають особливого значення. Я рекомендую останній метод, оскільки він покращує читабельність. Щоб включити карету, помістіть її де завгодно, окрім одразу після відкриття кронштейна. [x ^] відповідає x або caret. Ви можете поставити фіксуючу скобу відразу після кронштейна, що відкривається, або заперечної каретки. [] x] відповідає кінцевій дужці або x. [^] x] відповідає будь-якому символу, який не є закритим дужкою або x. Дефіс може бути включений відразу після кронштейна, що відкривається, або прямо перед дужкою, що закривається, або відразу після відкидної каретки.

На якій мові ви пишете регулярний вираз?


0

Це рішення вирішило мою проблему під час заміни тегу br на "\ n".

alert(content.replace(/<br\/\>/g,'\n'));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.