在我的Android应用中,\ {p {Punct}行为

时间:2016-05-16 10:54:32

标签: java android regex

这是我的正则表达式 - “[\\w\\d\\p{Punct}]+”

我的应用中\\p{Punct}的行为非常奇怪。 根据文档(https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html):

  

\ p {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);

1 个答案:

答案 0 :(得分:0)

问题是\p{Punct}匹配的POSIX [:punct:]字符类符号还包含符号\p{S}

要避免匹配没有符号的字符串

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

另请注意,在Android上,\w\p{P}\p{S}默认情况下支持Unicode。

Besdides,\w已匹配数字,没有必要将\w\d添加到相同的字符类[...]中。