找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 19618|回复: 2

[问题求助] Powershell中的replace正则和[regex]正则有何区别?

[复制链接]
发表于 2017-8-17 22:55:08 | 显示全部楼层 |阅读模式
如题,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的正则究竟有哪些更强大的地方,比如其可以做到,后者无法做到?
发表于 2017-8-17 23:39:18 | 显示全部楼层
[regex]只是一个声明的类型而已,表示这个变量是
正确声明方法应该是
[regex]$s='xxxx'
$s.GetType() -正则的表达式类型
发表于 2017-8-18 14:37:57 | 显示全部楼层
本帖最后由 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 运算符,因为这些选项没有提供内联字符。

评分

参与人数 1技术 +1 收起 理由
zhanglei1371 + 1 感谢帮助!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:48 , Processed in 0.018866 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表