2014-10-08 1 views
0

Я пытаюсь объединить HTODREDS из файлов .rtf, используя Powershell.Какой шаблон 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 TO "\ б" с Nothin (""). Я использовал /. B \ S/(FWD скосы как разделители, = "все, ноль или более раз", б \ S = буква B и пробел.) Я частично успешный, его отгонка части

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

до

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

Это заставляет меня думать, что после cf0 происходит перевод строки. Я попытался вырвать все линии подачи

-replace "\n*","" 

, который не менял строку.

Но я хочу сбросить ВСЕ предыдущую строку (от {\ rtf1 .... до правого перед окончательным текстом) & осталось с этим текстом конца ..... в этот момент я возьму трейлинг "}" выгрузите его в последующее-место

ответ

1

вы можете использовать оглядывайся регулярных выражений Добавлена ​​захватывая группы(*).и группа, не захватывающая запись (?:}), Так что он точно соответствует до}

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

Я знаю, что ОП сказал, что они согласятся с хвостом'} ', но они заявили, что они этого действительно не хотят. Вы можете захотеть установить группу захвата, а затем группу, не связанную с захватом, для завершающего '}' там. '(? <= \\ b) (. *) (?:}) $' – TheMadTechnician

+0

@TheMadTechnician, отлично, спасибо, обновил ответ. – radar

+0

Yay. работал. Спасибо. Можете ли вы объяснить? <= Часть этого ??? Я думаю, что \\ b избегает обратной косой черты, буквы b и пробела. .... и в конце вы привязываетесь к $, чтобы начать поиск назад с конца ??? – jazaddict

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

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 переключатель с 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 
} 
Смежные вопросы