Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 相同正则表达式的不同输出…为什么_Regex_String_Powershell - Fatal编程技术网

Regex 相同正则表达式的不同输出…为什么

Regex 相同正则表达式的不同输出…为什么,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-

我有一个文件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
谢谢,对不起,我的英语不好

更新:
为什么结果不正确?

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') }