当您需要“跳过”某个匹配项并替换另一个匹配项时,通常的“技巧”是匹配并捕获您需要的内容并匹配您不需要的内容。由于两种上下文的替换模式不同,您应该能够分析匹配对象,并Matcher#appendReplacement
提供以下功能:
String s = "some@domain.com\ndomain.com\nwww.domain.com\nhttp://www.domain.com\nhttps://www.domain.com";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(?i)\\S+@\\S+\\.\\S+|((?:https?://)?(?:[a-z0-9-]+[.])*[a-z0-9-]+[.][a-z]+/?[^\\s()<>]*)").matcher(s);
while (m.find()) {
if (m.group(1) != null) {
m.appendReplacement(result, "<a href=\"" + m.group(1) + "\">" + m.group(1) + "</a>");
}
else {
m.appendReplacement(result, m.group());
}
}
m.appendTail(result);
System.out.println(result.toString()); // Demo output
在线 Java 演示(java.util.regex
使用相同的技术)
图案细节:
\\S+@\\S+\\.\\S+
- 匹配类似于电子邮件的内容(1+ 个非空格、@
、1+ 个非空格,.
以及 1+ 个非空格)
|
- 或者
((?:https?://)?(?:[a-z0-9-]+[.])*[a-z0-9-]+[.][a-z]+/?[^\\s() <>]*)
- 第 1 组捕捉您的模式。
如果 Group 1 匹配,则不是null
,我们需要将其包装到标签中。否则,只需重新插入整个匹配项。