PowerShell字符串分割异常:匹配'for'排除'all for'时丢失字符's'
问题分析与解决
问题描述
需求:以"for"作为分隔符分割句子,但句子中出现"all for"时不执行分割操作。现有PowerShell代码运行后莫名丢失字母"s",代码如下:
$arr = 'It is all for you','It is for you' $arr | % {$_ -split '[^all] for'}
问题原因
你的正则表达式[^all] for存在逻辑错误:
[^all]是否定字符组,它的含义是匹配任意一个不是a或l的字符,而非匹配"不是all这个完整字符串"。- 以第二个字符串
It is for you为例,is for中的s不属于a或l,会被[^all]匹配,最终正则匹配的是s for。-split会将匹配到的部分从原字符串中移除,所以分割后得到It i和you,自然丢失了s。 - 第一个字符串
It is all for you中,all for前的l属于字符组[all],所以[^all]无法匹配,这部分不分割的逻辑是对的。
修复方案
使用负向后行断言实现需求,修改正则表达式为(?<!all )for,代码如下:
$arr = 'It is all for you','It is for you' $arr | ForEach-Object { $_ -split '(?<!all )for' }
解释
(?<!all )是负向后行断言,含义是:仅当for的前面不是all(注意all后有空格)时,才匹配这个for。- 这样
all for中的for不会被匹配,因此不执行分割;而单独的for会被匹配,执行分割操作,且不会丢失原字符串中的字符。
内容的提问来源于stack exchange,提问作者Oleg0341
相关产品推荐
相关产品推荐

