: ( "двоеточие" ) имеет особое значение в 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-строках.