如何用正则表达式匹配冒号包裹字符串及含单冒号的剩余片段?
PowerShell正则匹配解决方案
正确的正则表达式
(?::\S+:(?!\S)|[^:]*(?::(?!\S)|$))
使用示例
$targetStr = "This is a :key: and this is :anotherKey: but this: is normal text." $pattern = [regex]"(?::\S+:(?!\S)|[^:]*(?::(?!\S)|$))" $matchResults = $pattern.Matches($targetStr) # 遍历输出匹配结果 $matchResults.Value
执行后会得到你需要的匹配结果:
This is a:key:and this is:anotherKey:but this: is normal text.
正则逻辑说明
:\S+:(?!\S):精准匹配被冒号包裹的非空白字符序列(如:key:),(?!\S)确保该序列后接空白字符或字符串结尾,避免误匹配包含冒号的其他内容。[^:]*(?::(?!\S)|$):匹配任意非冒号字符,直到遇到**单独的冒号(后接空白/结尾)**或字符串结尾,这样就能把包含单独冒号的整段文本作为一个匹配项,不会拆分冒号。
对之前尝试的问题分析
- 表达式
(:\S+:(?!\S)|[^:]+):[^:]+会在遇到第一个冒号时停止匹配,导致this:里的冒号被孤立,无法将but this: is normal text.作为整体匹配。 - 表达式
(:\S+:(?!\S)|[^:]+|:):将单独的冒号单独拆分为一个匹配项,不符合整段文本匹配的要求。 - 表达式
(:\S+:(?!\S)|[^:]+(:|$)):[^:]+(:|$)逻辑错误,会把每个冒号都作为匹配终点,导致文本被过度拆分。
内容的提问来源于stack exchange,提问作者nicbjones
相关产品推荐
相关产品推荐

