Regex 相同正则表达式的不同输出…为什么
我有一个文件ids.txtRegex 相同正则表达式的不同输出…为什么,regex,string,powershell,Regex,String,Powershell,我有一个文件ids.txt 646646646 995775665 564548984 566466464 553553663 144235535 为什么这两个代码之间的输出不同: PS > [regex]::Replace($file,'^([0-9])([0-9]+)([0-9])$','$3$2$1') 646646646 595775669 464548985 466466465 353553665 544235531 PS> $file -replace '^([0-
646646646
995775665
564548984
566466464
553553663
144235535
为什么这两个代码之间的输出不同:
PS > [regex]::Replace($file,'^([0-9])([0-9]+)([0-9])$','$3$2$1')
646646646 595775669 464548985 466466465 353553665 544235531
PS> $file -replace '^([0-9])([0-9]+)([0-9])$','$3$2$1'
646646646
595775669
464548985
466466465
353553665
544235531
谢谢,对不起,我的英语不好
更新:
为什么结果不正确?PowerShell将$file转换为字符串,以便将其分配给[regex]::Replace()方法的[string]参数。此字符串的结果值取决于当前显示为空间“”的$OFS全局变量的值 这将产生与-replace相同的结果:
$file | foreach { [regex]::Replace($_,'^([0-9])([0-9]+)([0-9])$','$3$2$1') }
最新答复:
CLR[regex]::Replace()方法在'r(回车)上不匹配。看
您可以设置$OFS=“`n”),但在脚本中设置全局变量并不是一个好主意
如果确实需要对多行字符串执行替换(而不是像我前面的回答中那样按行执行),那么您还有一些其他选项:
1:将文件作为单个字符串读入并删除CRs:
$file=(获取内容'.\file.txt'-Raw)-替换“`r”
2:每行读取文件并在LF上加入:
$file=(获取内容“.\file.txt”)-加入“`n”
然而,通常认为“流式”处理数据是一种最佳做法。这样,用户可以在操作过程中获得反馈。在执行大型磁盘操作时,您经常会看到写得不好的应用程序出现挂起的情况,用户不知道是否有问题。对于小文件,它实际上没有什么区别,尽管我仍然建议在可能的情况下使用-replace操作符
这里需要注意的另一件事,[regex]::Replace()总是返回一个字符串,无论它是单线还是多线,例如,如果您向它传递一个包含10个字符串的数组,这些字符串将被合并,作为单个字符串传递给方法,并返回一个字符串
但是,-replace运算符返回给定的值。如果您传递一个字符串,它将返回一个字符串;如果您向它传递一个数组(大概和您的情况一样),它将返回一个数组
$file | foreach { [regex]::Replace($_,'^([0-9])([0-9]+)([0-9])$','$3$2$1') }