Символы отрицания в регулярном выражении

Как насчет случая, когда b1 == b2? (И если a == b1 и a == b2?)

Если это произойдет, то, вообще говоря, следующие два фрагмента кода могут иметь другое поведение:

if (a == b1) {
   /* do stuff here, and break out of the test */
} 
else if (a == b2) {
   /* this block is never reached */
} 

и:

if (a == b1) {
   /* do stuff here */
}
if (a == b2) {
   /* do this stuff, as well */
}

Если вы хотите четко очертить функциональность для разных случаев, используйте if-else или switch-case, чтобы сделать один тест .

Если вы хотите разную функциональность для нескольких случаев, используйте несколько if блоков в качестве отдельных тестов .

Это не вопрос «лучших практик», так и для определения того, есть ли у вас один тест или несколько тестов.

34
задан enterbutton 28 June 2017 в 21:52
поделиться

4 ответа

каретка внутри символьного класса [^] - это оператор отрицания, общий для большинства реализаций регулярных выражений (Perl, .NET, Ruby, Javascript и т. д.). Поэтому я бы сделал это так:

[^\W\s\d]
  • ^ - соответствует чему-либо, что НЕ входит в класс символов
  • \ W - соответствует не-словным символам (символ слова будет определяться как az, AZ, 0-9 и подчеркивание ).
  • \ s - соответствует пробелу (пробел, табуляция, возврат каретки, перевод строки)
  • \ d - соответствует 0-9

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

[A-Za-z]

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

Мне не совсем понятно, какие специальные символы вам не нужны. Но я выписал оба решения на тот случай, если одно вам подойдет лучше, чем другое.

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

Мне не совсем понятно, какие специальные символы вам не нужны. Но я выписал оба решения на тот случай, если одно вам подойдет лучше, чем другое.

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

Мне не совсем понятно, какие специальные символы вам не нужны. Но я выписал оба решения на тот случай, если одно вам подойдет лучше, чем другое.

76
ответ дан 27 November 2019 в 03:35
поделиться

В Perl это будет примерно так:

$string !~ /[\d \W]/

Конечно, это зависит от вашего определения «специальных символов». \ W соответствует всем символам, отличным от слов. Символ слова - это любой алфавитно-цифровой символ плюс пробел.

2
ответ дан 27 November 2019 в 03:35
поделиться

Самое важное, что нужно знать о регулярных выражениях, - это не их синтаксис, а способность четко объяснить, что вы ищете. Это действительно 90% проблемы.
Кроме того, обычно лучше заявить, чего вы хотите, чем чего не хотите.

0
ответ дан 27 November 2019 в 03:35
поделиться

Попробуйте ^ [^ 0-9 \ p {P}] $

0
ответ дан 27 November 2019 в 03:35
поделиться
Другие вопросы по тегам:

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