从字符串中提取文本

39

如何从一个字符串中提取“程序名称”。该字符串将如下所示:

% 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 %

程序名称是(SUB RAD MSD 50R III)。将结果存储到另一个字符串中即可。我正在学习PowerShell,因此您的答案解释将受到赞赏。


程序名称是否总是在括号中,或者它总是从第七个字符开始? - Andrey Marchuk
我正在处理的其他文件中有多行带有"()"。我需要的程序在第一个括号中。模式是在第一行上是"%",第二行以"O"开头,然后是一个四位数"????",然后程序直接在括号中。希望这能帮到大家。 - resolver101
4个回答

68

下面的正则表达式可以提取括号中的任何内容:

PS> $prog = [regex]::match($s,'\(([^\)]+)\)').Groups[1].Value
PS> $prog
SUB RAD MSD 50R III

解释(使用RegexBuddy创建)

Match the character '(' literally «\(»
Match the regular expression below and capture its match into backreference number 1 «([^\)]+Match any character that is NOT a ) character «[^\)]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the character ')' literally «\)»

进一步阅读:


1
谢谢你的回答。你能解释一下这个或者告诉我如何学习正则表达式吗?有什么好的推荐网站吗? - resolver101

20
如果程序名称始终是括号中的第一件事,并且除了末尾的一个括号之外不包含其他括号,则$yourstring -match "[(][^)]+[)]"可以进行匹配,结果将在$Matches[0]中。

1
由于-match返回一个布尔值,因此您可能想要在表达式上下文中使用类似于if($something -match "regexp") { $Matches[0] } else { '' }的语句。 - Nickolay

7

只是为了添加一个非正则表达式的解决方案:

'(' + $myString.Split('()')[1] + ')'

这会将字符串在括号处分隔,并从包含程序名称的数组中取出该字符串。

如果不需要括号,只需使用:

$myString.Split('()')[1]

1
使用-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

有多行带有“()”的代码。这个模式是: - resolver101
正则表达式根据新需求进行了调整。 - mjolinor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接