Board logo

标题: [问题求助] Powershell中的replace正则和[regex]正则有何区别? [打印本页]

作者: zhanglei1371    时间: 2017-8-17 22:55     标题: Powershell中的replace正则和[regex]正则有何区别?

如题,Powershell中的replace正则和[regex]正则有何区别?
  1. $a="abc-123-wer"
  2. $a -replace "(?im)\d+","test"
  3. $re=[regex]"(?im)\d+"
  4. $re.matches("abc-123-wer")|select-object -property value
复制代码
我想知道的是,[regex]比replace的正则究竟有哪些更强大的地方,比如其可以做到,后者无法做到?
作者: Nsqs    时间: 2017-8-17 23:39

[regex]只是一个声明的类型而已,表示这个变量是
正确声明方法应该是
[regex]$s='xxxx'
$s.GetType() -正则的表达式类型
作者: WHY    时间: 2017-8-18 14:37

本帖最后由 WHY 于 2017-8-20 14:59 编辑

一个是 PowerShell 内置的替换运算符,一个是 .NET Framework 中 System.Text.RegularExpressions.Regex 类的静态方法。

-replace 替换运算符一次性替换全部(global 全局标志为 True),Replace 方法可以替换其中的某一次或几次。
  1. ([regex]'(?i)a').Replace('aaaa', 'b', 1, 2) #替换 "aaaa" 中的 "a" 为 "b",替换1次,从第3个字符开始替换
复制代码
如果需要对捕获的子匹配调用其它函数方法,比如将子匹配转换大小写,-replace 替换运算符办不到,只能调用 Replace 方法。
这种办法是错误的:
  1. 'how are you' -replace '\b[a-z]', '$&'.ToUpper()
复制代码
这种办法是正确的:
  1. [regex]::Replace('how are you', '\b[a-z]', {param($a); $a.Groups[0].Value.ToUpper()})
复制代码
另外,.net 正则表达式中的一些选项,如 RightToLeft、ECMAScript、CultureInvariant 等不能用于 -replace 运算符,因为这些选项没有提供内联字符。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2