Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-用于全名的正则表达式_Java_Regex_String_Validation_Matcher - Fatal编程技术网

Java-用于全名的正则表达式

Java-用于全名的正则表达式,java,regex,string,validation,matcher,Java,Regex,String,Validation,Matcher,如何验证regex的全名?我只想要字母表(没有数字)和正则表达式的空格。这就是我到目前为止所做的。你能帮我修一下正则表达式吗?多谢各位 public static boolean isFullname(String str) { boolean isValid = false; String expression = "^[a-zA-Z][ ]*$"; //I know this one is wrong for sure >,< CharSequence i

如何验证regex的全名?我只想要字母表(没有数字)和正则表达式的空格。这就是我到目前为止所做的。你能帮我修一下正则表达式吗?多谢各位

public static boolean isFullname(String str) {
    boolean isValid = false;
    String expression = "^[a-zA-Z][ ]*$"; //I know this one is wrong for sure >,<
    CharSequence inputStr = str;
    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}
publicstaticbooleanisfullname(stringstr){
布尔值isValid=false;
String expression=“^[a-zA-Z][]*$”;//我肯定知道这个是错的><
CharSequence inputStr=str;
Pattern=Pattern.compile(表达式,Pattern.CASE不区分大小写);
Matcher Matcher=pattern.Matcher(inputStr);
if(matcher.matches()){
isValid=true;
}
返回有效;
}

[A-Z]
匹配单个大写字母(姓名的第一个字母)

[a-z]*
匹配任意数量的小写字母(其他字母或名称)

(\s)
匹配1个空白字符(名称之间的空格)

+
前面的一个或多个表达式(匹配多个名称)

总而言之:

-匹配名字/姓氏-

^([A-Z][A-Z]*(\s))+[A-Z][A-Z]*$

或者匹配像迪马吉奥·圣克罗伊、奥莱利和勒皮尤这样的名字。您可以添加类似的字符,如ᶜ' 以米计ᶜ金利,因为你记得他们或遇到的人与这些不太常见的字符在他们的名字

^([A-z\'\\)-ᶜ]*(\s))+[A-z\'\-ᶜ]*$

public static boolean isFullname(String str) {
    return str.matches("^[a-zA-z ]*$");
}
如果字符串仅包含字母和空格,则此方法返回true


但是如果字符串不包含任何内容,它也会返回true。

使用
\s
表示空格。您还可以使用测试字符串是否与正则表达式匹配

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]*$"; 
    return str.matches(expression);        
}

识别姓名的问题是一个以文化为中心的问题,它确实不可能可靠地发挥作用。我真的建议不要这样做,因为在我所知道的任何国家、任何地方,都有构成人名的标准形式。我可以合法地将我的姓名更改为
#&*∫Ω∆ 史密斯
,这不适合任何人的算法。这并不是说这个特定的例子是很多人都会做的事情,但很多人在考虑数据输入时不会跳出ASCII表,这会导致问题

你可以反驳这种情况发生的可能性,但在全球范围内,越来越不可能所有用户的名字都有英文音译。也很可能你的用户来自没有名字/姓氏概念的文化背景。即使你的应用程序on仅在给定的国家运行,您的一些用户不会来自其他地方(人们总是从一个国家移动到另一个国家,其中一些人可能想使用您的软件)


保护您的应用程序不受此类字段的SQL注入的影响(如果您将这些字段存储在数据库中),并保持不变。

此方法验证名称,如果名称没有任何内容或包含数字或特殊字符,则返回false:

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]+"; 
    return str.matches(expression);        
}

要求什么

您需要的不是
“^[a-zA-Z][]*$”
“^[a-zA-Z]*$”
,而是
。有些答案引用了
\s
,但您不需要这些答案,因为它们会给您其他空白,如选项卡

其他常见示例

另一方面,有名字和姓氏都含有催眠词,比如名字的
Mary Ann
,或者有连字符的姓氏,比如
Jones Garcia
。还有一些姓氏有句点,比如
St.Marc
。最后,在一些姓氏中,比如
O'Donnel

旁注

从法律上讲,你可以将你的名字改成…或者包含其他随机字符…但我不确定有多少系统能真正容纳这样的东西

如果您希望使用通用大小写(全球通用),那么不要用任何字符类型限制字段,因为您可以使用希腊字母、西里尔字母、中文字母等形式的名称。还有非英语重音字符和其他类似德语umlaut的字符

如果您担心SQL注入,请使用参数化查询而不是动态查询

建议的解决方案


如果您只担心英文字母,并且希望使用一个正则表达式来处理上面的示例,那么您可以使用
“^[a-zA-Z\-\.\']*$”

乔·迪马吉奥可能有话要说:-)@NullUser,它支持中间名。@pax,迪马吉奥先生可能有问题。我会继续复习《约翰·保罗·琼斯》在《勒内·弗莱明》中失败,《多明克·施特劳斯·卡恩》中失败《亨利八世》中失败《蒂姆·奥莱利》中失败《费德里科·佩尼亚秘书》中失败《汽车旅馆6》中失败《雪儿》中失败《安东尼奥·西普里亚诺·何塞·玛丽亚和弗朗西斯科·圣安娜·马查多·鲁伊斯》中失败。失败。在“\uuuuuu^^^^\\[[[[]][\ uuuuuuuuuuuu]上出现假阳性。不要对人的名字做任何假设。句号。当你应该使用
[\pL\pM\p{Nl}时,不要使用
[a-z]
。别忘了标点符号。那些名字像斯佳丽·奥哈拉或巴沙尔·阿萨德这样的人呢?用一句话来说,“认为某人的名字只能包含某些字符的代码是愚蠢、无礼和错误的。”非常感谢tchrist。我现在意识到我不应该验证正则表达式的全名。但我仍然不得不认为,即使是符号也可以通过验证“%^^^^#!@*”空字符串的假阳性。“Dominque Strauss‐Kahn”的假阴性@tchrist为什么你认为每个人都有一个名字?没有必要将
^
$
.matches()一起使用“\n\f\f\t”
上的假阳性…我可以合法地将我的名字更改为#&*∫Ω∆ 史密斯,这不适合任何人的算法…
^.*$