Java纯正则替换:保留指定匹配模式,移除其余内容
纯正则替换实现提取目标序列并格式化
可以通过三次连续的replaceAll调用实现需求,全程无需循环、流或其他遍历操作:
String input = "foo <em>12a123</em> bar <em>32A1234</em> baz"; // 第一步:保留目标序列,其余所有字符替换为空格 String step1 = input.replaceAll("(\\d{2}\\s?[a-zA-Z]\\s?\\d{2,5})|.", "$1 "); // 第二步:合并多余空格并去除首尾空格,得到用单个空格分隔的目标序列 String step2 = step1.replaceAll("\\s+", " ").trim(); // 第三步:为每个目标序列包裹<code>标签 String result = step2.replaceAll("(\\d{2}\\s?[a-zA-Z]\\s?\\d{2,5})", "<code>$1</code>");
步骤详解
第一步替换:
- 正则
(\\d{2}\\s?[a-zA-Z]\\s?\\d{2,5})|.匹配两种内容:要么是符合规则的目标序列(捕获为组1),要么是任意单个字符。 - 替换模板
$1表示:如果匹配到目标序列则保留它并追加一个空格,否则用空格替换该字符。这样所有非目标内容都会被转为空格,目标序列则被保留并间隔开。
- 正则
第二步替换:
\\s+匹配一个或多个连续空格,替换为单个空格,再通过trim()去除首尾多余空格,得到干净的、用单个空格分隔的目标序列字符串。
第三步替换:
- 再次匹配每个目标序列,将其替换为
<code>目标序列</code>格式,完成最终格式化。
- 再次匹配每个目标序列,将其替换为
示例验证
- 输入:
"foo <em>12a123</em>"→ 输出:<code>12a123</code> - 输入:
"<em>12 a123</em> bar <em>32A 1234</em>"→ 输出:<code>12 a123</code> <code>32A 1234</code> - 输入:
"foo bar"→ 输出:""
内容的提问来源于stack exchange,提问作者ibexit
相关产品推荐
相关产品推荐

