PowerShell正则表达式匹配含$符号行的问题求助
解决方案
核心要点
- 输入字符串用单引号包裹:避免PowerShell将
$解析为变量,保留原始字符串中的$字面量。 - 正则捕获分组:用三个分组分别捕获名字、找到的内容、地点,替换时按目标格式重组。
- 替换字符串用单引号:防止PowerShell解析替换字符串中的
$为变量引用。
具体代码示例
# 测试用例1 'Julie found "NoMoney" in "Easter Island"' -replace '^(\w+) found (.+?) in (.+)$', '$1($3) = $2' # 输出: Julie("Easter Island") = "NoMoney" # 测试用例2 'John found $SomeMoney$ in "Greenland"' -replace '^(\w+) found (.+?) in (.+)$', '$1($3) = $2' # 输出: John("Greenland") = $SomeMoney$ # 测试用例3 'Jimmy found $$LotsOfMoney in "Treasure Island"' -replace '^(\w+) found (.+?) in (.+)$', '$1($3) = $2' # 输出: Jimmy("Treasure Island") = $$LotsOfMoney # 测试用例4 'Judy found $5 in Tribeca.NY' -replace '^(\w+) found (.+?) in (.+)$', '$1($3) = $2' # 输出: Judy(Tribeca.NY) = $5
若必须使用双引号输入字符串
如果因为某些原因需要用双引号定义输入字符串,需用PowerShell的转义符`(反引号)转义$和双引号:
"John found `$SomeMoney`$ in `"Greenland`"" -replace '^(\w+) found (.+?) in (.+)$', '$1($3) = $2'
正则模式说明
^(\w+):匹配开头的名字(字母数字下划线,符合示例中的名字格式)。found (.+?) in:非贪婪匹配found和in之间的所有内容(即找到的钱/内容),确保不会过度匹配到后面的内容。(.+)$:匹配in之后到行尾的所有内容(即地点)。
替换字符串说明
$1:引用第一个分组捕获的名字。$3:引用第三个分组捕获的地点。$2:引用第二个分组捕获的内容,保留原始的$符号,因为正则替换引擎会直接输出分组内容的字面量。
内容的提问来源于stack exchange,提问作者Harjit S. Batra
相关产品推荐
相关产品推荐

