Как сопоставить дефисы с регулярным выражением?

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

6 ответов

Решение

Избегайте дефиса.

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

ОБНОВЛЕНИЕ:
Не берите в голову этот ответ - вы можете добавить дефис в группу, но вам не нужно избегать его. Вместо этого посмотрите ответ Конрада Рудольфа, который гораздо лучше отвечает и объясняет почему.

Дефис обычно является нормальным символом в регулярных выражениях. Только если он находится в классе символов и между двумя другими символами, он приобретает особое значение.

Таким образом:

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

Менее запутанно всегда использовать экранированный дефис, чтобы он не зависел от позиции. Это \- внутри класса символов в скобках.

Но есть кое-что еще, чтобы рассмотреть. Некоторые из перечисленных символов должны быть написаны по-другому. В некоторых обстоятельствах они определенно должны.

Это сравнение разновидностей регулярных выражений говорит о том, что C♯ может использовать некоторые из более простых свойств Unicode. Если вы имеете дело с Unicode, вам, вероятно, следует использовать общую категорию \p{L} для всех возможных букв, и, возможно, \p{Nd} для десятичных чисел. Кроме того, если вы хотите разместить всю эту пунктуацию, а не только HYPHEN-MINUS, вы должны использовать \p{Pd} имущество. Вы также можете написать эту последовательность пробельных символов просто как \sПредполагая, что это не слишком общее для вас.

Все вместе, это работает на Apattern [\p{L}\p{Nd}\p{Pd}!$*] чтобы соответствовать любой один символ из этого набора.

В любом случае, я бы, вероятно, использовал это, даже если бы не планировал работать с полным набором Юникода, потому что это хорошая привычка, и потому что эти вещи часто выходят за пределы своих первоначальных параметров. Теперь, когда вы поднимите его для использования в другом коде, он все равно будет работать правильно. Если вы жестко закодируете все символы, это не так.

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

Используйте "\p{Pd}" без кавычек, чтобы найти дефис любого типа. Символ '-' - это только один тип дефиса, который также является специальным символом в регулярном выражении.

Это то, что вы после?

MatchCollection matches = Regex.Matches(mystring, "-");
Другие вопросы по тегам