使用多个Java正则表达式

问题描述:

我试图提取一封电子邮件并使用模式(EMAIL_PATTERN)将其替换为空格。运行以下命令时,传入完整文档时不会生成任何输出。该模式只会匹配整个区域。所以这意味着如果我们只通过电子邮件,电子邮件将被匹配并被替换为一个空格。但以下方法的目的是找到电子邮件和以前的手动提取不是必需的。在tempString中的电子邮件被替换之后,我想将它用于下一个模式。我应该在一种方法中结合我想使用的模式,还是应该将它们放置在不同的方法中?以下是我现在的代码。另外我有其他模式,但由于我的方法工作不正常,我还没有发布。使用多个Java正则表达式

private static final String EMAIL_PATTERN = "[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})"; 
public static void main (String[] args) { 
//Document takes in a ID, student information(which includes email, address, phone, name), school, and text 
Document r = new Document("", "FirstName LastName, Address, [email protected], phoneNumber", "School", "experience", "text"); 
      personalEmailZone(r); 

} 
public static Document personalEmailZone(Document doc){ 
    //tempString is the personal information section of a resume 
    String tempPI = doc.tempString(); 
    if(doc.tempString().matches(EMAIL_PATTERN) == true){ 
     //Pattern pattern = Pattern.compile(""); 
     Pattern pattern = Pattern.compile(EMAIL_PATTERN); 
     Matcher matcher = pattern.matcher(tempPI); 
     String emailTemp = ""; 
     if(matcher.find()){ 
      emailTemp = matcher.group(); 
      System.out.println(emailTemp); 
      //PI.replace(emailTemp, ""); 
      System.out.println(emailTemp.replace(emailTemp, "")); 
      tempPI = tempPI.replace(emailTemp, ""); 
      System.out.println(tempPI); 
     } 
    } 
    return doc; 
} 

你有几个问题:

public static Document personalEmailZone(Document doc){ 
    //tempString is the personal information section of a resume 
    String tempPI = doc.tempString(); 
    if(doc.tempString().matches(EMAIL_PATTERN) == true){ 

上述声明试图对电子邮件地址模式整个文件相匹配。这不匹配,除非doc.tempString()只包含一个电子邮件地址,没有别的。

 //Pattern pattern = Pattern.compile(""); 
     Pattern pattern = Pattern.compile(EMAIL_PATTERN); 
     Matcher matcher = pattern.matcher(tempPI); 
     String emailTemp = ""; 
     if(matcher.find()){ 
      emailTemp = matcher.group(); 
      System.out.println(emailTemp); 
      //PI.replace(emailTemp, ""); 
      System.out.println(emailTemp.replace(emailTemp, "")); 

不确定上述内容。如果你的代码达到了这一点,它总是会打印一个空行。

  tempPI = tempPI.replace(emailTemp, ""); 
      System.out.println(tempPI); 
     } 

由于没有循环,您将只替换第一次出现的电子邮件地址。如果您期望替换所有出现的事件,则需要循环输入。

} 
    return doc; 

此时你还没有真正被修改doc,所以你的原始形式返回文件,用电子邮件地址包括在内。

} 

看的Javadoc String#replaceAll(String regex, String replacement)

您可以将您的模式放在不同的方法中,这些方法会返回文本模式用法的修改字符串。例如

String tempPI = doc.tempString(); 
tempPI = applyPattern1(tempPI); 
tempPI = applyPattern2(tempPI) 
tempPI = applyPattern3(tempPI); 

由于doc.tempString().matches(EMAIL_PATTERN) == true,您的代码没有显示任何输出。也许它不需要那里,因为它期望整个字符串是一个电子邮件。