前几天使用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方法。