Java中正则表达式匹配特定首尾格式字符串问题求解
错误原因排查
你写的正则存在3个核心问题:
- 空格数量限制不符合要求:规则允许符号间有0-5个空格,你正则中写的是
\\s{0,3},仅支持最多3个空格,不符合规则 - 中间内容匹配逻辑错误:你用单个
.匹配前缀后缀之间的内容,只能匹配1个任意字符,且直接和后缀的>拼接,完全不满足「前缀后缀之间可为任意内容」的要求 - 缺少匹配模式适配:
.默认无法匹配换行符,若你的内容包含换行会直接匹配失败
正确实现方案
场景1:匹配整个输入字符串完全符合规则
// Pattern.DOTALL 作用是让.可以匹配换行符,^匹配字符串开头,$匹配字符串结尾 Pattern pattern = Pattern.compile("^<\\s{0,5}<\\s{0,5}\\*\\s{0,5}<\\s{0,5}.*?\\s{0,5}>\\s{0,5}>\\s{0,5}\\*\\s{0,5}>\\s{0,5}>$", Pattern.DOTALL);
场景2:从长文本中提取符合规则的子串
// 去掉首尾的^和$,非贪婪匹配.*?避免多个符合规则的子串出现匹配重叠 Pattern pattern = Pattern.compile("<\\s{0,5}<\\s{0,5}\\*\\s{0,5}<\\s{0,5}.*?\\s{0,5}>\\s{0,5}>\\s{0,5}\\*\\s{0,5}>\\s{0,5}>", Pattern.DOTALL);
正则规则对应说明
- 前缀部分:
<\\s{0,5}<\\s{0,5}\\*\\s{0,5}<严格匹配两个<、一个*、一个<的顺序,相邻符号之间允许0-5个空格 - 中间部分:
.*?采用非贪婪匹配任意长度的内容,搭配Pattern.DOTALL可覆盖包含换行的场景 - 后缀部分:
\\s{0,5}>\\s{0,5}>\\s{0,5}\\*\\s{0,5}>\\s{0,5}>严格匹配两个>、一个*、两个>的顺序,相邻符号之间允许0-5个空格
内容的提问来源于stack exchange,提问作者Lee Andrew
相关产品推荐
相关产品推荐

