不能使用regex java从String中获取char序列

时间:2017-02-02 14:58:50

标签: java regex

例如,我有字符串“john smith 12 03 1993” 任务是将约翰史密斯推向另一个。 现在我正在尝试使用正则表达式[a-z] \ s (java验证),但它不起作用只给出没有约翰的“史密斯”

String test = "john smith 11 12323 2323";
    Pattern pattern = Pattern.compile("[a-z]*\\s*");
    Matcher matcher = pattern.matcher(test);
    matcher.matches();
    matcher.find();
    System.out.println(matcher.group());

3 个答案:

答案 0 :(得分:1)

您只匹配1个0+字母和0个以上空格。

您需要在while循环中使用matcher.find()并使用[a-z]+\b[a-z]+\b等正则表达式:

String test = "john smith 11 12323 2323";
Pattern pattern = Pattern.compile("[a-z]+");
Matcher matcher = pattern.matcher(test);
while (matcher.find()) {
    System.out.println(matcher.group());
}
// => john, smith

请参阅Java demo

如果你需要匹配"单词"在空格/字符串结尾之前,请使用"\\b[a-z]+(?!\\S)"正则表达式。

要匹配john smith,您可以使用"^[a-z]+(?:\\s+[a-z]+)*"正则表达式(然后您可以将while替换为if,因为您只期望1匹配。)

String test = "john smith 11 12323 2323";
Pattern pattern = Pattern.compile("^[a-z]+(?:\\s+[a-z]+)*");
Matcher matcher = pattern.matcher(test);
if (matcher.find()) {
    System.out.println(matcher.group());
} // => john smith

请参阅this Java demo

答案 1 :(得分:1)

    String test = "john smith 11 12323 2323";
    Pattern pattern = Pattern.compile("^([a-z]+ [a-z]+).*");
    Matcher matcher = pattern.matcher(test);
    matcher.matches();
    System.out.println(matcher.group(1));

group(0)始终是整个String(测试)。如果单词不是“test”中的第一个单词,请将^替换为.*

答案 2 :(得分:1)

Java有一些工具可以使这更容易:特别是命名组允许您编写可读的正则表达式并轻松提取字段:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Class {
  public static void main(String... args) {
    final String test = "Андрей Парфёнов 05 15 1955";
    final Pattern pattern = Pattern.compile("" +
      "^(?<name>" +
        "(?<firstName>.+)\\s+" +
        "(?<lastName>.+))\\s+" +
      "(?<date>" +
        "(?<month>\\d{2})\\s+" +
        "(?<day>\\d{2})\\s+" +
        "(?<year>\\d{4}))$");
    final Matcher matcher = pattern.matcher(test);
    matcher.matches();
    System.out.println(matcher.group("name"));
  }
}