使用多个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
,您的代码没有显示任何输出。也许它不需要那里,因为它期望整个字符串是一个电子邮件。