You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式:PowerShell中如何匹配单个空格或短横线实例?

搞定PowerShell里匹配单个空格/短横线的需求

嘿,作为正则新手在PowerShell里卡壳太正常了!我看你想要的是匹配单独出现的单个空格或者短横线——也就是排除那种连续多个的情况(比如你测试数据里的--、---),下面给你具体的解决方案:

核心正则思路

要精准匹配单个的空格或短横线,我们需要确保目标字符的前后都不是相同的字符(或者处于字符串的开头/结尾),用.NET正则的负向前后查找就能实现:

(?<!\s)\s(?!\s)|(?<!-)-(?!-)

拆解开看更清楚:

  • (?<!\s)\s(?!\s):专门匹配单个空格——(?<!\s)确保这个空格的前面不是空格,(?!\s)确保后面也不是空格,完美避开连续空格
  • (?<!-)-(?!-):同理匹配单个短横线,前后都不能是短横线,直接排除--、---这种连续情况
  • |:把两个规则合并,意思是“匹配单个空格 或者 单个短横线”

在PowerShell里的实际用法

结合你的测试数据"test--asd :45; wth---notcool: 69",给你两种常见场景的代码示例:

1. 找出所有符合要求的匹配项

如果你想定位这些单个空格/短横线的位置和内容,用这段代码:

$testString = "test--asd :45; wth---notcool: 69"
$matchedItems = [regex]::Matches($testString, '(?<!\s)\s(?!\s)|(?<!-)-(?!-)')

foreach ($item in $matchedItems) {
    Write-Host "找到匹配:'$($item.Value)',在字符串中的位置是索引 $($item.Index)"
}

运行后会输出测试数据里的两个单个空格(因为你的测试数据里没有单个短横线):

找到匹配:' ',在字符串中的位置是索引 10
找到匹配:' ',在字符串中的位置是索引 27

2. 把连续的短横线/空格统一替换成单个(如果这是你隐藏的需求)

很多新手其实是想把连续的多个短横线或空格改成单个,这种情况正则更简单:

$testString = "test--asd :45; wth---notcool: 69"
# 先把所有连续短横线替换成单个-
$processedStr = $testString -replace '-+', '-'
# 再把所有连续空格替换成单个空格
$processedStr = $processedStr -replace '\s+', ' '

Write-Host "处理后结果:$processedStr"

输出结果:

处理后结果:test-asd :45; wth-notcool: 69

小提示

PowerShell里的-replace默认不区分大小写,咱们这个需求不需要管大小写,直接用就行。要是你其实只是想匹配任意单个空格/短横线(不管是不是连续的),那直接用\s|-就行,但这样会把--里的每个-都匹配到,应该不是你想要的,所以优先用前面的负向查找方案哦~

内容的提问来源于stack exchange,提问作者CodeNagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:58