Как сопоставить дефисы с регулярным выражением?
Как переписать [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, "-");