Developer --} Tester --} QA? Senior Tester ? Lead ? Manager?

PowerShell中的单引号和双引号问题

上一篇 / 下一篇  2010-11-02 22:35:45 / 个人分类:烂笔头

前几天使用PowerShell来处理字符串,用到正则表达式,其中用错引号,导致处理的结果就是不对,浪费了N个小时。


A. 在开始的时候,如是写:

$ss = [System.Text.RegularExpressions.Regex]::Replace($no, "(\w+)(\s)(\w+)", “$3$2$1")
发现没有得到替换


B. 换了一个替换项之后:

$ss = [System.Text.RegularExpressions.Regex]::Replace($no, "(\w+)(\s)(\w+)", “$+")
发现结果有些问题,少了些东西。


这个时候就开始怀疑是正则表达式错了(第二个参数)或者替换项错了(第三个参数),不停地改,不停地试。结果始终不是想要得。


C. 最后突然灵光一闪,试试单引号的:

$ss = [System.Text.RegularExpressions.Regex]::Replace($no, "(\w+)(\s)(\w+)", '$3$2$1')
替换成功。


翻了翻Windows PowerShell Pocket Reference 看到如下话语:

To define a literal string (one in which no variable or escape expansion occurs), enclose it in single quotes:

$myString = 'hello 't $ENV:SystemRoot'

$myString gets the actual value of hello 't $ENV:SystemRoot.

To define an expanding string (one in which variable and escape expansion occurs), enclose it in double quotes:

$myString = "hello 't $ENV:SystemRoot"

$myString gets a value similar to hello C:\WINDOWS.


也就是单引号里面的内容固定了,不会变。双引号里面的内容可以加变量,是动态的。


这里只能猜测,"$1"会先被PowerShell处理掉(PowerShell认为$1是一个变量),这样处理后的字符串再传入Replace方法,这时此方法接受到的参数里面的替换项已经不对了,所以导致之前一直得不到正确的结果。

由此只能传单引号的替换项到Replace方法。


TAG: 双引号 替换 正则 正则表达式 引号 PowerShell Powershell replace 变量 单引号

 

评分:0

我来说两句

Open Toolbar