2016-05-16 2 views
1

Это мое регулярное выражение - “[\\w\\d\\p{Punct}]+”\ р {Punct} поведение в моем андроид приложение

Это очень странное поведение \\p{Punct} в моем приложении. Согласно документации (https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html):

\ р {Punct} - Пунктуации: Один из "# $% &«() * +, -/:; < => @ [] ^.? _` {|} ~

Но в моем приложении этот тег всегда пропускает эти символы: «$», «+», «<», «>», «=», «^», «`» , «|», «~»

abc!d => true 
abc#d => true 
abd$d => false 
abc<>d = > false 

т.д.

Я пытался использовать

Pattern pattern = Pattern.compile("[\w\d\p{Punct}]+", Pattern.UNICODE_CASE); 

Там не было никакого эффект.

Anny предлагает, что я делаю неправильно?

P.S .: Я использую TextWatcher для этого. Я делаю это так:

TextWatcher textWatcher = new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // I am checking it here 
      // if if(!s.toString().matches("[\\w\\d\\p{Punct}]+")) => do something 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 

     

}; 

Когда я добавил это TextWatcher к MyEditText:

myEditText.addTextChangedListener(textWatcher); 
+0

@anubhava Я пробовал, но без каких-либо эффектов. – Alex

ответ

0

Вопрос заключается в том, что \p{Punct} соответствует символы класса [:punct:] символов POSIX, которые также включают в себя символы, \p{S}.

Чтобы избежать сопоставления строк без символов вам нужно:

"^[\\w\\p{P}]+$" 

Кроме того, обратите внимание, что на Android, \w, \p{P} и \p{S} являются Юникод по умолчанию.

Besdides, \w уже соответствует цифрам, нет никакого смысла добавлять как \w и \d в тот же класс персонажа [...].

+0

Спасибо, да, это работает! Но вопрос в том, как не соответствовать строке только с английскими символами? Что-то вроде этого "[a-zA-Z \\ p {P} \\ p {S}] +"? – Alex

Смежные вопросы