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

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

Ответ 1

Побег дефиса.

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

MatchCollection matches = Regex.Matches(mystring, "-");

Ответ 5

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

Ответ 6

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