正则表达式匹配带冒号结尾的引号内模式中的连字符
解决方案:匹配特定模式内的连字符
要精准匹配那些位于以冒号结尾的连字符分隔单词序列中的连字符,我们可以使用带有正向/反向断言的正则表达式,确保只捕获符合场景要求的连字符。
最终正则表达式
(?<=\w)-(?=\w+(?:-\w+)*:)
正则逻辑拆解
让我们一步步拆解这个表达式的作用:
(?<=\w):反向肯定预查,确保连字符-的前面是一个单词字符(字母、数字、下划线),避免匹配字符串开头的无效连字符。-:我们要匹配的目标字符——连字符。(?=\w+(?:-\w+)*:):正向肯定预查,确保连字符后面的内容满足:- 首先是至少一个单词字符
\w+ - 接着可以有零或多组
-\w+(也就是额外的连字符+单词组合) - 最终以冒号
:结尾,这是整个模式的关键判定条件
- 首先是至少一个单词字符
场景验证(对应你的测试用例)
我们逐个测试你给出的场景:
- 模式
"word-word"::匹配到1个-
正则会捕获word和word之间的连字符,因为整个序列以冒号结尾,符合预查条件。 - 模式
"word-word":无匹配
序列结尾没有冒号,正向预查不满足,因此不会捕获任何连字符。 - 模式
"word-word-word"::匹配到2个-
两个连字符都满足前后是单词字符,且整个序列最终以冒号结尾,因此全部被匹配。 - 模式
"word-word:无匹配
不仅结尾没有冒号,字符串本身还不完整,正向预查完全不满足,无匹配结果。
额外说明
如果你的"word"定义不包含下划线,或者需要更精准的字符范围,可以把\w替换成[a-zA-Z0-9]来限制为纯字母数字。
内容的提问来源于stack exchange,提问作者Cristian Carli
相关产品推荐
相关产品推荐

