Як поєднати дефіси з регулярним виразом?


83

Як переписати [a-zA-Z0-9!$* \t\r\n]шаблон, щоб він відповідав дефісу разом із існуючими символами?


замість додавання пробілу та \ t ви можете додати \ s. \ s також відповідає іншим типам пробілів
Раду Сіміонеску

Відповіді:


72

Втеча з дефіса.

[a-zA-Z0-9!$* \t\r\n\-]

ОНОВЛЕННЯ :
Не зважайте на цю відповідь - ви можете додати дефіс до групи, але вам не доведеться його уникати. Натомість див. Відповідь Конрада Рудольфа, яка набагато краще відповідає та пояснює, чому.


Так це? Це тому, що це в групі персонажів? Моє ліжко.
Ніл Барнвелл,

11
@KonradRudolph Ви маєте рацію, але я не впевнений, що некеровану версію легше зрозуміти. Два можливі способи використання тире заплутані, тому для цього виникають запитання щодо цього. Це, звичайно, більш елегантно, як тільки ви дізнаєтесь про це, але для початківців це трохи заплутано.
Крістоф Руссі,

186

Дефіс зазвичай є нормальним символом у регулярних виразах. Лише якщо це в класі символів та між двома іншими символами, це набуває особливого значення.

Отже:

  • [-] відповідає дефісу.
  • [abc-]матчі a, b, cабо дефіс.
  • [-abc]матчі a, b, cабо дефіс.
  • [ab-d]сірники a, b, cабо d( тільки тут дефіс позначає діапазон символів).

1
@rrr Ви хочете, щоб він написав це для вас, а також написав? Все, що вам потрібно зробити, це додати дефіс до групи.
Ніл Барнвелл,

10
@rrrr: Я вірю, що дав відповідь. Питання було “як написати“ Х ”...”, і я вважаю, що я пояснив, як це зробити. Беручи мою відповідь та застосовуючи пояснення до фактичного висловлювання, що потребує, не вимагатиме більше пізнавальних навичок, ніж це вимагається від першокласника. Насправді це саме те , що навчаються робити першокласники, коли їх навчають елементарній арифметиці. Не соромтеся виправляти моє припущення.
Конрад Рудольф


2
@MarkP Ну, duh: шістнадцяткові коди символів перетворюються інтерфейсним синтаксичним аналізатором (C #, або JavaScript, або будь-якою іншою мовою, яку ви використовуєте) у фактичний символ. Отже, використання шістнадцяткових кодів те саме, що використання фактичних символів, що стосується значення рядка.
Конрад Рудольф

1
@Pshemo Звичайно, дурна помилка. Щодо тлумачення в [a-c-e]: це просто недійсне в деяких специфікаціях / механізмах регулярних виразів. Наприклад, регулярний вираз POSIX забороняє його.
Конрад Рудольф

13

Менше заплутано завжди використовувати дефіс, що втік, так що він не повинен бути позиційно залежним. Це \-всередині класу символів у дужках.

Але є дещо інше для розгляду. Деякі з цих перелічених символів, можливо, слід писати інакше. За деяких обставин вони точно повинні.

Це порівняння ароматів регулярних виразів говорить про те, що C♯ може використовувати деякі простіші властивості Unicode. Якщо ви маєте справу з Unicode, вам, мабуть, слід використовувати загальну категорію \p{L}для всіх можливих літер, а можливо , і \p{Nd}для десяткових чисел. Крім того, якщо ви хочете вмістити всі ці пунктичні знаки, а не лише ДІФЕН-МІНУС, вам слід скористатися \p{Pd}властивістю. Можливо, ви також захочете написати таку послідовність пробілів як \s, припускаючи, що це не надто загально для вас.

Все разом це працює на зразок того, [\p{L}\p{Nd}\p{Pd}!$*]щоб відповідати будь-якому одному персонажу з цього набору.

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


Я схильний погодитися з цією відповіддю, чим менше вам потрібно знати, тим безпечніше код. Це нагадує мені про пріоритети оператора проблем: stackoverflow.com/questions/10007140/… , я вважаю, що в них є дужки (автоматично додані моєю IDE), не потрібно їх усіх знати. Ви або хтось інший може рано чи пізно зіпсувати. Звичайно, якщо ви багато працюєте з регулярними виразами у своїх проектах, вам може знадобитися мати більш передові знання.
Крістоф Руссі,

4

[-a-z0-9] +, [a-z0-9 -] +, [az-0-9] +, а також [az-0-9] + - однакові. Дефіс між двома діапазонами розглядається як а також [a-z0-9 - + ()] + цей регулярний вираз допускає дефіс.


Має бути однією з найкращих відповідей.
Razor's Edge


1

використовуйте "\ p {Pd}" без лапок, щоб відповідати дефісу будь-якого типу. Символ "-" - це лише один тип дефіса, який також є спеціальним символом у регулярному виразі.

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