这是我的正则表达式 - “[\\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);
答案 0 :(得分:0)
问题是\p{Punct}
匹配的POSIX [:punct:]
字符类符号还包含符号\p{S}
。
要避免匹配没有符号的字符串:
"^[\\w\\p{P}]+$"
另请注意,在Android上,\w
,\p{P}
和\p{S}
默认情况下支持Unicode。
Besdides,\w
已匹配数字,没有必要将\w
和\d
添加到相同的字符类[...]
中。