如何使用模式和匹配器?

时间:2018-04-15 14:25:46

标签: java regex

我有两个关于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));

2 个答案:

答案 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+");

然后,使用上面的匹配逻辑来检查每个条目。