2010-11-01 3 views
44

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

+0

вместо добавления пространства и \ t вы можете добавить \ s. \ s соответствует другим типам белых пространств, а также –

ответ

47

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

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

UPDATE:
Ничего этот ответ - вы можете добавить дефис в группе, но вы не должны избежать. См. Konrad Rudolph's answer, а это намного лучше отвечает на вопросы и объясняет, почему.

+0

Полностью не нужно. –

+0

О, не так ли? Это потому, что это в группе персонажей? Виноват. –

+5

@KonradRudolph Вы правы, но я не уверен, что невыпущенная версия легче понять. Два возможных способа использования тире сбивают с толку, поэтому перед этим есть вопросы об этом. Это, безусловно, более элегантно, как только вы об этом знаете, но для новичков это немного запутанно. –

2

Вы ищите это после вас?

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

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

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

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

@rrr Вы хотите, чтобы он написал его для вас, а также изложил его? Все, что вам нужно сделать, это добавить дефис в группу. –

+8

@rrrr: Я действительно верю, что я дал ответ. Вопрос заключался в том, «как писать« X »...», и я считаю, что объяснил, как это сделать. Принимая мой ответ и применяя объяснение к фактическому выражению под рукой, не должно требоваться больше навыков познания, чем требуется первокласснику. Фактически, это * точно * то, что первоклассники учатся делать, когда учат основную арифметику. Не стесняйтесь исправить мое предположение. –

+0

[Hyphen взят буквально изнутри класса символов, если он не может сформировать диапазон] (http://stackoverflow.com/questions/29458636/how-does-this-pattern-match-hyphen-without-escape). – MAKZ

9

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

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

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

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

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

+0

Я, как правило, согласен с этим ответом, тем меньше вам нужно знать более безопасный код. Это напоминает мне проблемы с приоритетами оператора: http://stackoverflow.com/questions/10007140/operator-precedence-and-ternary-operator, я беру их в круглых скобках (автоматически добавляемый моей IDE), не нужно знать их всех , Вы или кто-то еще может испортить рано или поздно. Конечно, если вы много работаете с регулярным выражением в своих проектах, вам может потребоваться более продвинутое знание. –

0

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

0

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

Смежные вопросы