Java正则匹配:排除行首行尾的至少两个连续星号分隔符
解决方案
要提取至少两个连续星号且既不在行首也不在行尾的子串,核心是通过环视断言排除行首/行尾的星号序列,以下是两种可靠的正则方案:
方案1:基于行首行尾的负向环视
正则表达式:
(?<!^)\*{2,}(?!$)
逻辑说明:
(?<!^):负向后行断言,确保星号序列不是从行首开始(即序列前有其他字符)\*{2,}:匹配至少两个连续星号(?!$):负向前瞻断言,确保星号序列不是到行尾结束(即序列后有其他字符)
方案2:基于非星号字符的正向环视
如果需要更严格地确保星号前后都是非星号字符(避免星号序列嵌套在更长星号串中间的情况),可以用:
(?<=[^*])\*{2,}(?=[^*])
逻辑说明:
(?<=[^*]):正向后行断言,确保星号序列前一个字符不是星号(自然排除行首情况,因为行首无字符)\*{2,}:匹配至少两个连续星号(?=[^*]):正向前瞻断言,确保星号序列后一个字符不是星号(自然排除行尾情况)
测试验证
针对你提供的示例文本:
*** DRIVER FEE -10.00/DAY - SPOUSE ALSO CHARGED ****QUALIFICATIONS FOR RENTERS FROM NON US COUNTRIES*** -MUST HAVE A *** VALID DRIVERS LICENSE***
两个正则都会精准匹配到:
****(QUALIFICATIONS前的星号序列)***(COUNTRIES后的星号序列)***(VALID前的星号序列)
同时自动排除行首的***和行尾的***,完全符合需求。
为什么之前的\b/\B方案无效?
\b是单词边界(仅在单词字符\w和非单词字符\W的分界处触发),而星号属于非单词字符\W,当星号前后都是非单词字符(比如空格)时,\b不会触发,无法准确区分行首/行尾的星号序列,因此不适合这类场景。
内容的提问来源于stack exchange,提问作者Stefano Falconetti
相关产品推荐
相关产品推荐

