Java 程序说我所有的有效输入都无效(可能是正则表达式代码问题?)
问题: 提示用户输入名称。姓名可能有称呼语,有效称呼语为“先生”和“女士”。接下来,在一个空白字符后面,如果有称呼,则是名字。在另一个空白字符之后,可能有也可能没有中间的首字母,这是一个大写字母,后面可能有也可能没有“.”。最后,在另一个空格后,给出姓氏。名字和姓氏都将以大写字母开头。使用单个正则表达式检查确定输入名称是否有效。如果有效,请打印名字和姓氏。如果没有,请让用户知道 例如: 程序:请输入一个名称: 用户:Ryan D Scott先生 节目:瑞安·斯科特 程序:请输入一个名称: 用户:Ryan D.Scott先生 节目:瑞安·斯科特 程序:请输入一个名称: 用户:Ryan Scott 节目:瑞安·斯科特 程序:请输入一个名称: 用户:赖恩·斯科特先生 节目:瑞安·斯科特 程序:请输入一个名称: 用户:Ryan D Scott 节目:瑞安·斯科特 程序:请输入一个名称: 用户:第六号,福拉夫面船长 程序:无效名称 程序:请输入一个名称: 使用者:海绵宝宝 节目:海绵宝宝 我需要帮助修复正则表达式,并让它输出输入的名字和姓氏,如上面更新的代码示例所示Java 程序说我所有的有效输入都无效(可能是正则表达式代码问题?),java,regex,matching,Java,Regex,Matching,问题: 提示用户输入名称。姓名可能有称呼语,有效称呼语为“先生”和“女士”。接下来,在一个空白字符后面,如果有称呼,则是名字。在另一个空白字符之后,可能有也可能没有中间的首字母,这是一个大写字母,后面可能有也可能没有“.”。最后,在另一个空格后,给出姓氏。名字和姓氏都将以大写字母开头。使用单个正则表达式检查确定输入名称是否有效。如果有效,请打印名字和姓氏。如果没有,请让用户知道 例如: 程序:请输入一个名称: 用户:Ryan D Scott先生 节目:瑞安·斯科特 程序:请输入一个名称: 用户:
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class lab2q2 {
public static void main(String[] args) {
String RegularExp = "((Mr|Ms))?[A-Z][a-z]+([A-Z]([a-z]+\\.))?([A-Z](a-z)+)";
Pattern pattern = Pattern.compile(RegularExp);
Scanner keyboard = new Scanner(System.in);
for(int i = 0; i< 11; i++)
{
System.out.println("Please enter a name: ");
String inputString = keyboard.nextLine();
Matcher matcher = pattern.matcher(inputString );
if (!matcher.matches())
{
System.out.println("Name: " + inputString);
}
else
{
System.out.println("Invalid name.");
}
}
keyboard.close();
}// end method main
}// end class
你最后的a-z+应该是[a-z]+
你不允许有空格,你也没有做。首字母为可选
首字母应该是[A-Z]而不是[A-Z][A-Z]+
你们不符合线路的起点和终点
纠正
^(?:(?:Mr|Ms)\ )?([A-Z][a-z]+)\ (?:[A-Z]\.?\ )?([A-Z][a-z]+)$
我用下面的regexp检查了您的示例
((Mr |Ms ))?([A-z][a-z]*[ ]?)([A-Z]?(\\.){1}[ ]?)?([A-z]{1}[a-z]*[ ]?)
另外,不知道你将得到的可能值的范围,但你应该考虑到斯佳丽·奥哈拉女士名字上的一些其他可能的字符是无效的。
对于这类名称,您可以使用
((Mr |Ms ))?([A-Z][A-Za-z']*[ ]?)([A-Z]?(\.){1}[ ]?)?([A-z]{1}[A-Za-z']*[ ]?)
我想你需要加上图案
似乎你的正则表达式没有考虑名字之间的空格。第六个Fluffyface上尉失败是因为你的正则表达式中没有包含数字,fawzi qaisi失败是因为你指定名字的第一个字母必须是大写…我想你最后一次抓捕也是为了[a-z]而不是a-z。是的,不考虑空格。使用在线正则表达式测试工具,使用给出的示例对正则表达式进行微调。当我将其输入代码时,它表示答案无效。抱歉:另外,我使用IntelliJ上的正则表达式测试仪来检查正则表达式。你也可以在你喜欢的IDE中添加一个插件,这非常有效!!!!!!现在,我如何让它只输出输入的第一个和姓氏,而不输出Mr或Ms和中间的首字母?对于System.out.PrintLName:+inputString;我需要改变什么才能输出Fawzi Qaisi是输入是Fawzi Qaisi先生还是Fawzi A.Qaisi?恭喜你喂了吸血鬼…为什么我的答案被否决了我能知道吗??
import java.util.*;
public class lab2q2 {
public static void main(String[] args) {
String RegularExp = "((Mr|Ms))?[A-Z][a-z]+([A-Z]([a-z]+\\.))?([A-Z](a-z)+)";
Pattern pattern = Pattern.compile(RegularExp);
Scanner keyboard = new Scanner(System.in);
for(int i = 0; i< 11; i++)
{
System.out.println("Please enter a name: ");
String inputString = keyboard.nextLine();
Matcher matcher = pattern.matcher(inputString );
if(!matcher.matches()) {
System.out.println("Name: " + inputString);
}
else
{
System.out.println("Invalid name.");
}
}
keyboard.close();
}// end method main
}//