什么REGEX模式将我的字符串的最后一部分?

时间:2014-10-08 18:15:08

标签: regex powershell

我正在尝试使用Powershell合并.rtf文件的HUNDREDS。

以下是格式: 一堆CSS东西跟着我想要的部分......

 {\rtf1\ansi {\fonttbl{\f0 Arial;}}{\colortbl\red255\green255\blue255;}{\stylesheet
}\paperw11685\paperh1560\margl600\margr600\margt600\margb600\pard\plain\f0\fs28\cf0
\ql\li75\ri75\fi0\b Instructions: }

在这种情况下,我希望保留“说明:”

{\rtf1\ansi {\fonttbl{\f0 Arial;}}{\colortbl\red255\green255\blue255;}{\stylesheet
}\paperw10530\paperh1920\margl600\margr600\margt600\margb600\pard\plain\f0\fs28\cf0
\ql\li75\ri75\fi0\b You will be presented with fifty (50) questions which are ran
domly selected from a pool of hundreds of questions. }

在这种情况下,我希望保留“您将收到五十(50)个问题     从数百个问题中挑选出来。“

Powershell脚本是这样的:

$files = (dir *.rtf)
$outfile = "AllQuestions.rtf"
$files | %{
$_.Name | Add-Content  $outfile 
$MyVar = Get-Content $_.Name    
$MyVar=$MyVar -replace ".*b\s","" | Add-Content  $outfile 
}

我的意图是用nothin(“”)替换所有字符串UP TO“\ b”。 我用/.b \ s /(fwd斜面作为分隔符,。 =“所有零次或多次”,b \ s =字母b和空格)我部分成功;它剥离一部分

{\rtf1........cf0
\ql\li75\ri75\fi0\b Instructions: }

{\rtf1........cf0 
Instructions: }

这让我觉得cf0之后有一个换行符。我试图去掉所有的换行

-replace "\n*",""  

没有改变字符串。

但是我想把所有前一个字符串(从{\ rtf1 ....到最终文本之前)转储到&留下那个结束文本.....在这一点上,我将把尾随“}”转储到后续的替换

4 个答案:

答案 0 :(得分:1)

你可以使用正则表达式背后的外观 添加了捕获组(。*) 和非捕获组(?:}),以便它恰好匹配到}

(?<=\\b )(.*)(?: })$

答案 1 :(得分:0)

尝试使用此正则表达式($指向一行的结尾)以获取“说明:”或“将向您显示五十(50)个问题,这些问题是从数百个问题池中选出的。”部分:

\\b(.*)}$

答案 2 :(得分:0)

替换它:

.*?\\b(?!.*?\\b)[ ]*([^}]+)

要:

$1

实施例

$MyVar -replace $regex,'$1'

Demo

答案 3 :(得分:0)

您可以使用多行正则表达式:

$text = (@'
{\rtf1\ansi {\fonttbl{\f0 Arial;}}{\colortbl\red255\green255\blue255;}{\stylesheet
}\paperw10530\paperh1920\margl600\margr600\margt600\margb600\pard\plain\f0\fs28\cf0
\ql\li75\ri75\fi0\b You will be presented with fifty (50) questions which are randomly selected from a pool of hundreds of questions. }
'@)

$text -replace '(?ms).+\\b([^}]+)}.*','$1'

 You will be presented with fifty (50) questions which are randomly selected from a pool of hundreds of questions. 

将-Raw开关与Get-Content一起使用以将文件读取为多行文本:

$files = (dir *.rtf)
$outfile = "AllQuestions.rtf"
$files | %{
$_.Name | Add-Content  $outfile 
$MyVar = Get-Content $_.Name -Raw    
$MyVar=$MyVar -replace '(?ms).+\\b([^}]+)}.*','$1' | Add-Content  $outfile 
}