如何删除字符串末尾单词(除非为"money")?PowerShell正则求助
解决方案:保留末尾"money",删除其他末尾单词
问题分析
你需要删除字符串末尾的任意单词,仅当末尾单词是money时保留原字符串。之前尝试的正则'Hellow money' -replace '.*[^money]$'逻辑错误:[^money]是字符集,匹配除m、o、n、e、y外的任意单个字符,结合.*贪婪匹配后,只会留下不符合字符集的单个字符,完全无法实现需求。
有效正则方案
针对PowerShell环境,使用反向否定预查精准匹配末尾非money的单词,替换为空即可:
基础版本(适用于单词仅含字母/数字/下划线)
# 测试示例1:末尾非money,删除单词 "Hello monet" -replace '\b(?!money\b)\w+$', '' # 输出: "Hello " # 测试示例2:末尾是money,保留原字符串 "Hello money" -replace '\b(?!money\b)\w+$', '' # 输出: "Hello money" # 测试单单词情况 "monet" -replace '\b(?!money\b)\w+$', '' # 输出: "" "money" -replace '\b(?!money\b)\w+$', '' # 输出: "money"
扩展版本(支持含特殊字符的单词,如标点)
如果末尾单词包含非字母数字的特殊字符,将\w+替换为[^ \t\n]+(匹配任意非空白字符序列):
"Hello monet!" -replace '\b(?!money\b)[^ \t\n]+$', '' # 输出: "Hello "
正则解释
\b:单词边界,确保匹配的是完整单词,避免部分匹配(比如不会误删mone)(?!money\b):反向否定预查,检查接下来的单词不是money(\b确保是完整的money单词)\w+/[^ \t\n]+:匹配目标单词(前者仅支持字母数字下划线,后者支持所有非空白字符)$:锚定到字符串末尾,确保只匹配最后一个单词
内容的提问来源于stack exchange,提问作者Oleg0341
相关产品推荐
相关产品推荐

