Должны ли регулярные выражения обрабатывать регистр или мы должны указывать регистр для соответствия в коде? - PullRequest
1 голос
/ 20 августа 2010

Исходя из этого вопроса, который я задал вчера:

Можно ли сократить это регулярное выражение?

Решением было использование следующего выражения:

^([a-z]{5}-){4}[a-z]{5}$ 

Чтобы проверить соответствие для строки в следующем формате:

aBcDe-fghIj-KLmno-pQRsT-uVWxy

Мне посоветовали опустить AZ в моем исходном запросе и сделать регистр нечувствительным к регистру в коде, который используетЭто.Например, укажите RegExOptions.IgnoreCase в конструкторе для RegEx в C #.

Есть ли какая-либо причина, почему это должно быть сделано в коде, а не в самом регулярном выражении?

Я думаю, что этот вопросдостаточно для того, чтобы оправдать новый вопрос, а не продолжать обсуждение вчера.

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Нет абсолютно правильного ответа на этот вопрос. Есть несколько способов достичь определенных целей, и иногда лучший - субъективный. Кроме того, два пути не совсем идентичны.

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

Возможно, хорошим руководящим принципом является следующее:

  • Флаг нечувствительности к регистру может использоваться для указания того, что (за исключением встроенных модификаторов, которые переопределяют настройку) весь процесс сопоставления с образцом нечувствителен к регистру
  • Если нечувствительность к регистру не применяется ко всему процессу сопоставления с образцом, вы можете отказаться от флага и просто указать, что некоторые части

Обратите внимание, что на самом деле существует большая разница между этими двумя шаблонами:

/([a-z]+)-\1/i
/([A-Za-z]+)-\1/

Оба шаблона соответствуют "FOO-FOO" и "bar-bar", но первый шаблон соответствует "BOO-boo" (, как видно на rubular.com ). Второй шаблон не (, как видно на rubular.com ).

Смотри также

  • regular-expressions.info / Модификаторы
    • Указание режимов внутри регулярного выражения
      • Вместо /regex/i (Pattern.CASE_INSENSITIVE в Java) вы можете сделать /(?i)regex/
    • Включение и выключение режимов только для части регулярного выражения
      • Вы также можете сделать /first(?i)second(?-i)third/
    • Диапазон модификаторов
      • Вы также можете сделать /first(?i:second)third/

Похожие вопросы

1 голос
/ 20 августа 2010

Есть ли какая-либо причина, почему это должно быть сделано в коде, а не в самом регулярном выражении?

Я могу представить себе случаи, когда вам нужно сопоставить, включая case, поэтому вы хотите, чтобыконтроль в самом регулярном выражении.Я также могу вспомнить случаи, когда возможность писать только строчными буквами, а затем устанавливать механизм без учета регистра, облегчает написание и поддержку выражения.Включающая платформа и язык / инструменты, вероятно, будут влиять на предпочтения.

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

0 голосов
/ 20 августа 2010

Полагаю, нет никакой реальной причины, кроме читабельности. В вашем случае это не имеет значения, если вы предоставите два дополнительных A-Z вместо использования RegExOptions.IgnoreCase, IMO. Но если вы используете довольно много a-zA-Z в регулярном выражении, то может быть полезно использовать a-z и RegExOptions.IgnoreCase для небольшого сокращения регулярного выражения.

Все дело в личных предпочтениях, если вы спросите меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...