2016-08-08 7 views
0

Я работаю в RTF-файле, где мне нужно вставлять теги в пользовательский язык разметки, который программа заменяет данными. Например, в файле, у меня есть:Найти строки между << and >>, которые содержат обратную косую черту

Account number: <<@Account.AccountNumber>> 

я редактирую этот шаблон в Microsoft Word 2007 и всякий раз, когда я забой, Microsoft Word вставляет кучу RTF мусора в шаблоне так что я получаю что-то вроде этого:

<<@Am\hich\af1\dbch\af31505\loch\f1 ount>> 

Вместо:

<<@Amount>> 

Как найти везде, где это случилось? Я пробовал писать регулярные выражения для этого, но я не знаю, как их писать очень хорошо. Вот один, что я пробовал:

<<.+?\\.+?>> 

Но когда я прохожу в этой фразе:

<<Where: Phrase =\ @Value>>\<<hi>>\hi<<hi>> 

обратной косой после «=» должен быть согласован, но ни обратной косой черты между "< < Где > > «и» < < привет > > «теги, ни„\ привет“между» < < привет > > "метки должны быть согласованы (regex101.com и Notepad + + соответствует им).

Меня не волнует, соответствуют ли только обратные косые черты, или все теги с обратными косыми чертами в них. Моя конечная цель - просто найти их быстро в Notepad ++ (или в другом редакторе, если это необходимо), чтобы я мог их исправить.

+0

Try '<< (s?) (?: (<<)?!.) * \ K (?:? \\ [аз] \ w *) + \ s' заменить пустой строкой. Я не уверен, что это будет работать так, как вы ожидаете, если в '>' может быть несколько '' '' ''. Else, попробуйте '(? S) (?: << | (?! ^) \ G) ((?: (?! <<).) *?) (?: \\ [az] \ w *) + \ s' заменить на '$ 1', если внутри' <<...>> 'может быть много.'. –

ответ

1

Вы можете использовать следующее регулярное выражение:

<<[^\\>]*\\[^>]*>> 

Demo

Объяснение:

  • << открывающий тег вашего пользовательского языка разметки
  • [^\\>]* любое количество символов, которое является не \ или >
  • \\ буквальным \
  • [^\\>]* любое количество символов, которые не >
  • >> закрывающий тег пользовательского языка разметки

EDIT:, чтобы соответствовать, даже если символ > может находиться внутри настраиваемого тега разметки, вы можете использовать следующее выражение, которое опирается на атомные группы/pos sessive кванторов, чтобы предотвратить катастрофические откаты и держать спички быстро:

<<(?>(?>[^\\>]*)(?>>(?!>))?)*+\\(?>(?>[^>]*)(?>>(?!>))?)++>> 

Это похоже на предыдущее выражение, но включает в себя:

  • (?>...) атомных группы
  • (?>>(?!>))? необязательно совпадает >, если не сразу последовали другим >
  • *+ любое количество раз + имущественный квантор
  • ++ по крайней мере один раз + притяжательное квантор

Demo

+0

Это регулярное выражение не соответствует '< @Am \ hich \ af1 \ dbch \ af31505 \ loch \ f1 ount >>' –

+0

Спасибо, @ WiktorStribiżew, но, к счастью, язык разметки кажется очень простым и не позволяет вложенности. Ответ Кита, похоже, работает на меня. – Sean

+0

@ WiktorStribiżew: Ой, я говорил слишком рано. Язык разрешает> и <операторы в предложении Where, и это не работает для << Where: Column> Value >> – Sean

Смежные вопросы