[a-zA-Z][\w]{1,}.*[\w]
(_)
识别为特殊字符。 当我输入" sss @"或" sss#"或" sss $"它的识别。
预期结果" test"," test @ test"," test_test"," tes"
意外结果" tes @"," test _"," te"
答案 0 :(得分:1)
由于您现在说它在Android中,请删除(?U)
。所有速记字符类在Android正则表达式中都已识别Unicode:
"\\p{L}+(?:[\\W_]\\p{L}+)*"
并将其与matches()
一起使用。
使用
Boolean isValid = groupNameString.matches("(?U)\\p{L}+(?:[\\W_]\\p{L}+)*");
请参阅online Java demo。
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(validateName("Dąb_rośnie$gdzieś#tu"));
System.out.println(validateName("Some_string_here"));
}
private static boolean validateName(String name) {
if (name.matches("(?U)\\p{L}+(?:[\\W_]\\p{L}+)*")) {
return true;
}
return false;
}
}
请注意,在使用String#matches()
时甚至不需要锚点,因为默认情况下此方法会锚定模式。
[\\W_]
将匹配任何特殊字符包含 a _
。
要匹配letters
+(_
+ letters
)*
模式,您可以使用
^[^\W\d_]+(?:_[^\W\d_]+)*$
您可以在JS或任何其他不支持Unicode的引擎中使用[^\W\d_]
而不是[a-zA-Z]
,而只需要处理ASCII字母。
支持Unicode的等效项:
^\p{L}+(?:_\p{L}+)*$
此处,\p{L}
匹配任何Unicode字母。
<强>详情:
^
- 字符串锚的开始[^\W\d_]+
/ \p{L}+
- 一个或多个字母(?:_[^\W\d_]+)*
- 零次或多次出现:
_
- _
[^\W\d_]+
/ \p{L}+
- 一个或多个字母$
- 字符串锚定结束。请参阅this regex demo。
答案 1 :(得分:0)
试试这个正则表达式
^[A-z]+[^\`|\~|\!|\@|\#|\$|\%|\^|\&|\_|\*|\(|\)|\+|\=|\[|\{|\]|\}|\||\\|\'|\<|\,|\.|\>|\?|\/|\""|\;|\:|\s]+$