:
( "двоеточие" ) имеет особое значение в regexp
Но мне нужно использовать его как есть, например [A-Za-z0-9.,-:]*
Я пытался избежать этого, но это не работает [A-Za-z0-9.,-\:]*
Как ввести ":" ( "двоеточие" ) в regexp?
Ответ 1
В большинстве реализаций регулярных выражений (включая Java) :
не имеет особого значения ни внутри, ни вне класса символов.
Ваша проблема, скорее всего, связана с тем, что -
действует как оператор диапазона в вашем классе:
[A-Za-z0-9.,-:]*
где ,-:
соответствует всем символам ascii между ','
и ':'
. Обратите внимание, что он по-прежнему совпадает с литералом ':'
.
Попробуйте это вместо:
[A-Za-z0-9.,:-]*
Поместив -
в начале или в конце класса, он соответствует литералу "-"
. Как упоминалось в комментариях Кеоки Зи, вы также можете избежать -
внутри класса, но большинство людей просто добавляет его в конец.
Демонстрация:
public class Test {
public static void main(String[] args) {
System.out.println("8:".matches("[,-:]+")); // true: '8' is in the range ','..':'
System.out.println("8:".matches("[,:-]+")); // false: '8' does not match ',' or ':' or '-'
System.out.println(",,-,:,:".matches("[,:-]+")); // true: all chars match ',' or ':' or '-'
}
}
Ответ 2
Будьте осторожны, -
имеет специальное значение с regexp. В []
вы можете поставить его без проблем , если он помещен в конец. В вашем случае ,-:
принимается как от ,
до :
.
Ответ 3
Colon не имеет особого значения в символьном классе и не нуждается в экранировании. Согласно PHP regex docs, единственные символы, которые должны быть экранированы в классе символов, следующие:
Все символы, отличные от алфавитно-цифровых символов чем
\
,-
,^
(в начале) и завершение]
не являются особыми в классы символов, но это не наносит вреда если они экранированы.
Подробнее о регулярных выражениях Java см. документы.
Ответ 4
используйте \\:
вместо \:
.. \
имеет особое значение в java-строках.