具有相同正则表达式的不同输出...为什么

时间:2014-04-03 08:38:42

标签: 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-9])([0-9]+)([0-9])$','$3$2$1'

646646646
595775669
464548985
466466465
353553665
544235531

感谢抱歉我的英语不好

更新

$_ofs = $Ofs
$ofs = "`r`n"
[regex]::Replace($file,'^([0-9])([0-9]+)([0-9])$','$3$2$1','multiline')
$ofs = $_ofs


646646646
995775665
564548984
566466464
553553663
544235531

为什么结果不正确?

1 个答案:

答案 0 :(得分:1)

PowerShell将$ file转换为字符串,以便将其分配给[regex] :: Replace()方法的[string]参数。此字符串的结果值取决于$ OFS全局变量的值,该变量当前显示为空格''。

这应该给你与-replace:

相同的结果
$file | foreach { [regex]::Replace($_,'^([0-9])([0-9]+)([0-9])$','$3$2$1') }

更新回答:

CLR [regex] :: Replace()方法与`r(回车)不匹配。请参阅this answer

可以设置$ OFS =“`n”,但在脚本中设置全局变量并不是一个好主意。

如果确实需要在多行字符串上执行替换(而不是在我之前的答案中按行进行),那么您还有其他一些选项:

1:将文件作为单个字符串读取并删除CR:     $ file =(Get-Content'。\ file.txt'-Raw)-replace“`r”

2:每行读取文件并加入LF:     $ file =(Get-Content'。\ file.txt')-join“`n”

然而,通常认为“流式传输”数据是最佳做法。这样,用户可以在操作期间获得的反馈。很多时候,您会看到执行大型磁盘操作时写得不好的应用程序似乎挂起,让用户不知道是否存在问题。对于小文件,它确实没有区别,尽管我仍然建议你尽可能使用-replace运算符。

另外需要注意的是,[regex] :: Replace()总是会返回单个字符串,无论是单行还是多行,例如如果你传递一个包含10个字符串的数组,字符串就会被连接起来,作为单个字符串传递给方法,并返回一个字符串。

但是,-replace运算符返回给定的内容。如果你传递一个字符串,它会返回一个字符串;如果你传递一个数组(在你的情况下,大概是),它会返回一个数组。