2014-10-08 58 views
0

我想使用PowerShell合併數百個.rtf文件。什麼REGEX模式會讓我成爲一個字符串的最後部分?

這裏的格式: 一堆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 
} 

我的意圖是UP更換所有的字符爲 「\ B」 與虛無( 「」)。 我用/。 b \ S /(FWD斜面作爲定界符, = 「一切零次或多次」,B \ S =字母B和一個空格)。我部分成功;它的汽提部分

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

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

這讓我覺得在cf0之後有一個換行。我試圖去掉所有的換行符

-replace "\n*","" 

沒有改變字符串。

但是我想轉儲所有以前的字符串(從{\ rtf1 ....到最終文本之前的右邊)&留下那個結束文本.....在這一點上,我將採取拖尾「}」轉儲它在隨後更換

回答

1

可以使用向後看正則表達式 添加捕獲組(*)。和非捕獲組(?:}),以便它恰好匹配爲止}

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

我知道OP說他們會接受尾部的'}',但他們確實聲明他們並不是真的想要它。你可能想要設置一個捕獲組,然後在那裏設置一個非捕獲組。 '(?<= \\ b)(。*)(?:})$' – TheMadTechnician 2014-10-08 18:54:41

+0

@TheMadTechnician,完美,謝謝,更新了答案。 – radar 2014-10-08 19:04:48

+0

耶。工作。謝謝。你能解釋一下嗎?<=這部分?我認爲\\ b正在逃避反斜槓,字母b和空格。 ....最後,你錨定一個$從最後開始向後搜索? – jazaddict 2014-10-08 20:02:59

0

試試這個正則表達式($是指一行的結尾),以獲得「說明:」或「你將被提出五十(50)個問題是主宰從數百個問題池中選擇「」部分:

\\b(.*)}$ 
+0

這將匹配一切都會過去的第一個' \ b'找到。在這個例子中,它將匹配'lue255;} {\ stylesheet } \ paperw10530 \ paperh1920 \ margl600 \ margr600 \ margt600 \ margb600 \ pard \ plain \ f0 \ fs28 \ cf0 \ ql \ li75 \ ri75 \ fi0 \ b您將會被呈現五十(50)個從數百個問題池中選出的 的問題。 ' – TheMadTechnician 2014-10-08 18:44:05

0

替換此:

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

要:

$1 

$MyVar -replace $regex,'$1' 

Demo

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交換機獲取內容讀取該文件爲多行文字:

$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 
} 
相關問題