提取姓名和电子邮件地址的正则表达式在网站中效果良好,但在java代码中效果不佳

提取姓名和电子邮件地址的正则表达式在网站中效果良好,但在java代码中效果不佳,java,regex,Java,Regex,我编写了一个从给定字符串中提取姓名和电子邮件地址的方法。我使用下面的正则表达式 "FROM: (?: ?([^ ]*)?\\s)?(?:<?(.+@[^>]+)>?)" “FROM:(?:?([^]*)?\\s)?(?:来自java文档: 匹配器是通过调用模式的匹配器方法从模式创建的。一旦创建,匹配器可用于执行三种不同类型的匹配操作: matches方法尝试根据模式匹配整个输入序列 lookingAt方法尝试将输入序列与模式匹配,从开头开始 find方法

我编写了一个从给定字符串中提取姓名和电子邮件地址的方法。我使用下面的正则表达式

"FROM: (?: ?([^ ]*)?\\s)?(?:<?(.+@[^>]+)>?)"
“FROM:(?:?([^]*)?\\s)?(?:来自java文档:

匹配器是通过调用模式的匹配器方法从模式创建的。一旦创建,匹配器可用于执行三种不同类型的匹配操作:

  • matches方法尝试根据模式匹配整个输入序列
  • lookingAt方法尝试将输入序列与模式匹配,从开头开始
  • find方法扫描输入序列,寻找与模式匹配的下一个子序列
如您所见,
matches
方法只会在整个正则表达式与数据匹配时返回
true
。 在您的情况下,您试图查找与正则表达式匹配的数据部分,因此应该使用
查找
方法

因此,您的代码应该如下所示:

public void extractNameAndEmail(String input) {
    if(input == null)
        return;

    String reg = "FROM: (?: ?([^ ]*)?\\s)?(?:<?(.+@[^>]+)>?)";

    Pattern pattern = Pattern.compile(reg);

    Matcher matcher = pattern.matcher(input);
    if(matcher.find()) {
        System.out.println(matcher.group());
    }

}
public void extractNameAndEmail(字符串输入){
如果(输入==null)
返回;
String reg=“FROM:(?:?([^]*)?\\s)?(?:来自java文档:

匹配器是通过调用模式的匹配器方法从模式创建的。一旦创建,匹配器可用于执行三种不同类型的匹配操作:

  • matches方法尝试根据模式匹配整个输入序列
  • lookingAt方法尝试将输入序列与模式匹配,从开头开始
  • find方法扫描输入序列,寻找与模式匹配的下一个子序列
如您所见,
matches
方法只会在整个正则表达式与数据匹配时返回
true
。 在您的情况下,您试图查找与正则表达式匹配的数据部分,因此应该使用
查找
方法

因此,您的代码应该如下所示:

public void extractNameAndEmail(String input) {
    if(input == null)
        return;

    String reg = "FROM: (?: ?([^ ]*)?\\s)?(?:<?(.+@[^>]+)>?)";

    Pattern pattern = Pattern.compile(reg);

    Matcher matcher = pattern.matcher(input);
    if(matcher.find()) {
        System.out.println(matcher.group());
    }

}
public void extractNameAndEmail(字符串输入){
如果(输入==null)
返回;

String RG= =“从:(?):([^)*?s)?(?):首先需要修剪额外的字符(更改表达式),或者考虑使用<代码> Matter .FIN()/<代码>,而不是<代码> Matter(Matter)()/代码>,然后在找到匹配后修剪额外的字符。首先需要修剪额外的字符(更改表达式)或者考虑使用<代码> Matter .Fund()/<代码>而不是<代码> Matter(Matcess)(<)>代码>,然后在找到匹配后修剪额外的字符。