Как создать класс персонажей из следующего набора

+ - * / % < > = ! & ^ | ? :

Я пробовал:

[+-*/%<>=!&^|?:]

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

4 ответа

Решение

Вам нужно будет избежать - в противном случае это будет интерпретироваться как диапазон символов между + а также *, который не действителен:

[+\-*/%<>=!&^|?:]

Другие метасимволы, насколько я знаю, взяты буквально в классе персонажей.

Вам не нужна маскировка, если вы ставите минус как первый или последний символ в вашей группе, потому что тогда он не может означать "до", как в [az]. Точно так же знак каретки означает "не в этой группе" только в том случае, если это первый символ группы: [^az]:= не az.
Квантификаторы (+?*) Не имеют никакого смысла в группе, поэтому символы, используемые для их представления, здесь стоят сами за себя. Другие символы никогда не значат что-то особенное в регулярных выражениях.

Быстрая демонстрация в Scala:

for (c <- "-+*/%<>=!&^|?:") yield ("" + c).matches ("[-+*/%<>=!&^|?:]") 
res1: scala.collection.immutable.IndexedSeq[Boolean] =
  Vector(true, true, true, true, true, true, true, true, true, true, true, true, true, true)

Вместо того, чтобы явно перечислять символы для сопоставления, вы можете попробовать использовать один из классов символов, таких как \p{Punct} (соответствует пунктуации US-ASCII) или \W соответствует несимвольным символам!(A-Za-z0-9).

Вы бы использовали что-то вроде \p{Punct}* или \W*, они могут привести к чему-то немного более широкому, чем ваш другой поиск, но это не может быть плохо....

Прочитав инструкцию:-)? + соответствует как минимум одному предыдущему символу, * означает любое количество символов, | является логическим или, ^ определяет отрицание символа. Вы также можете избежать всех их, чтобы быть уверенным!

РЕДАКТИРОВАТЬ

Я вижу, я должен был также прочитать руководство сначала:-)

Другие вопросы по тегам