我有两个关于Pattern
的简单问题。
首先是阅读给定的名字和姓氏。我需要告诉他们是否包含数字或标点字符。如果没有,它是一个有效的名称。无论我输入什么,输出都是
这不是有效名称。
我做错了什么?
Scanner input = new Scanner(System.in);
System.out.print("Enter: ");
String name = input.next();
Pattern p = Pattern.compile("[A-Za-z]");
Matcher m = p.matcher(name);
boolean n = m.matches();
if (n == true) {
System.out.println(name);
}
else {
System.out.println("This is not a valid name.");
}
第二个问题:我读了一个工资金额列表,以美元符号$
开头,后跟非负数,并将有效工资保存到数组中。我的程序可以输出数组,但无法区分$
。
Scanner sc = new Scanner(System.in);
System.out.print("Enter Salary: ");
String salary = sc.nextLine();
Pattern pattern = Pattern.compile("($+)(\\d)");
Matcher matcher = pattern.matcher(salary);
String[] slArray=pattern.split(salary);
System.out.print(Arrays.toString(slArray));
答案 0 :(得分:0)
你的正则表达式模式是错误的。您缺少重复该模式的符号。
目前,您[A-Za-z]
只匹配一个字母。您可以重复使用
*
- 0到无限重复?
- 0到1次重复+
- 1到无限重复{x, y}
- x到y重复所以你可能想要像[A-Za-z]+
这样的模式。您可以使用regex101.com等网站来测试您的正则表达式模式(它还详细说明了模式)。有关模式的示例,请参阅regex101/n6OZGp。
Here是关于正则表达式重复符号的教程。
对于第二个问题,您需要知道$
是正则表达式中的特殊符号。它代表一条线的终点。如果您想匹配$
符号,则需要通过添加反斜杠来转义:
"\\$\\d+"
请注意,您需要添加两个反斜杠,因为反斜杠本身在Java中具有特殊含义。所以你首先需要使用反斜杠来逃避反斜杠,以便字符串本身包含反斜杠:
\$\d+
然后传递给正则表达式引擎。如果您想匹配+
符号,则需要将其转义。
如果您只想针对模式检查给定的String
,可以使用String#matches
方法:
String name = "John";
if (name.matches("[A-Za-z]+")) {
// Do something
}
另请注意,\w
与[A-Za-z0-9_]
(单词字符)相似,是if (n == true) { ... }
的缩写。
代码
if (n) { ... }
可以简化为
n
由于boolean
已经是true
,因此您无需再针对NumberFormat format = NumberFormat.getCurrencyInstance();
Number num = format.parse("$5.34");
进行测试。
要解析货币值,您应该考虑使用已经给定的方法,例如
$('.back').click(function(e) {
e.stopPropagation();
请参阅课程的shorthand character classes以获取示例。
答案 1 :(得分:0)
我甚至不会使用正式的匹配器来处理这些简单的用例。 Java的String#matches()
方法可以轻松处理这个问题。要使用您的规则检查有效名称,您可以尝试:
String name = input.next();
if (name.matches("[A-Za-z]+")) {
System.out.println(name);
}
else {
System.out.println("This is not a valid name.");
}
要查看工资金额,您可以使用:
String salary = sc.nextLine();
if (salary.matches("\\$\\d+(?:\\.\\d+)?")) {
System.out.println("Salary is valid.");
}
关于第二种模式\$\d+(?:\.\d+)?
的注释,我们需要逃避美元符号,因为它是一个正则表达式元字符。此外,我没有在两种模式中的任何一种中使用^
和$
锚点,因为String#matches()
默认情况下将模式应用于整个字符串。
修改强>
如果您在给定行中有多个货币金额,则按空格拆分以获取货币字符串数组:
String input = "$23 $24.50 $25.10";
String[] currencies = input.split("\\s+");
然后,使用上面的匹配逻辑来检查每个条目。