正则表达式: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
相关产品推荐
相关产品推荐

