如何使用Regex过滤掉PowerShell字符串中不需要的部分并替换?

gsa*_*ica 2 regex string powershell

我对PowerShell -replace运算符在使用正则表达式时的工作方式感到困惑.我在线查找文档,但找不到比基本用法更详细的内容:它查找字符串,并将该字符串替换为另一个字符串(如果已定义)或什么都没有.大.

我想和这个问题中的人做同样的事情,用户想从复杂的字符串中提取一个简单的程序名.这是我试图复制的代码:

 $string = '% O0033(SUB RAD MSD 50R III) G91G1X-6.4Z-2.F500 G3I6.4Z-8.G3I6.4 G3R3.2X6.4F500 G91G0Z5. G91G1X-10.4 G3I10.4 G3R5.2X10.4 G90G0Z2. M99 %'
 $program = $string -replace '^%\sO\d{4}\((.+?)\).+$','$1'
 $program

 SUB RAD MSD 50R III
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,输出字符串是用户想要的字符串,其他所有字符串都被过滤掉了.对我来说,唯一的区别是我想要一个由六位数字组成的字符串,而不是别的.但是,当我尝试在我的正则表达式的字符串上执行此操作时,我得到了这个:

$string2 = '1_123456_1'
$program2 = $string -replace '(\d{6})','$1'
$program2

1_123456_1
Run Code Online (Sandbox Code Playgroud)

没有变化.为什么会这样?我的代码应该是什么?此外,$1代码中使用了什么?

bri*_*ist 5

-replace运营商将只替换匹配字符串的一部分.捕获组匹配匹配的某个子集(或所有匹配),并且可以在替换字符串中引用捕获组,如您所见.

您的第二个示例仅匹配您要提取的部分.因此,您需要确保匹配整个字符串,但只捕获要保留的部分,然后使替换字符串与捕获匹配:

$string2 = '1_123456_1'
$program2 = $string -replace '\d_(\d{6})_\d','$1'
$program2
Run Code Online (Sandbox Code Playgroud)

你如何匹配"其余的字符串"取决于你; 这取决于它可能包含的内容.所以我上面所做的只是一种可能的方式.其他可能的模式:

1_(\d{6})_1
[^_]*_(\d{6})_[^_]*
^.*?(\d{6}).*?$
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 5

在模式中捕获组(未转义的括号对)用于允许轻松访问匹配的部分.在-replace字符串上使用时,将匹配所有非重叠子字符串,并替换/删除这些子字符串.

在你的情况,-replace '(\d{6})', '$1'意味着您更换整场比赛(即等于第一次捕捉,因为你附带捕获组的整个模式)与本身.

-match当你想要获得字符串的一部分时,在像你这样的情况下使用:

PS> $string2 = '1_123456_1'
PS> $string2 -match '[0-9]{6}'
PS> $Matches[0]
123456
Run Code Online (Sandbox Code Playgroud)

-match将是第一场比赛,只是你想要的.

使用-replace时,你需要得到修改字符串返回(格式化字符串,插入/删除字符和类似的东西).