Поиск в VSCode многострочного содержимого набора тегов XML с использованием регулярного выражения - PullRequest
0 голосов
/ 05 апреля 2020

Я использую VSCode для глобального поиска XML файлов. В этих файлах есть несколько экземпляров этих XML тегов: <translated></translated>. Мне нужно найти все вхождения любых дефисов -, которые существуют где-либо между этими тегами, где содержимое этих тегов может быть в нескольких строках.

<translated>
    Content is here
    Could be on multiple lines
    The meeting could take 3-4 hours
</translated>

В приведенном выше примере фраза "3- 4 часа "содержит дефис. Мне нужно регулярное выражение, которое работает для VSCode, который находит все случаи дефисов, которые находятся в пределах набора этих XML тегов.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Причина, по которой -(?=[^<]*?<\/translated>) не работает в vscode, заключается в том, что он явно не содержит новую строку \n. Даже если [^<] включает в себя новые строки, \n необходимо записать в регулярное выражение, чтобы активировать многострочный параметр. Почему это так?

См. https://github.com/microsoft/vscode/issues/75265, в котором используется аналогичное регулярное выражение. Эта проблема интересна для чтения;>} Главным образом из соображений производительности.

Так что просто использование этого

-(?=[^<]*?\n*<\/translated>)

работает в vscode!


-(?=[^<]*?\n<\/translated>) будет работать и для вас, если у вас нет однострочных блоков, таких как:

<translated>Con-tent is he-re</translated>
0 голосов
/ 05 апреля 2020

Вариант 1 (с использованием кода VS)

Это соответствует только одному да sh за раз, а не всем тире. Это связано с ограничением поиска внутри одного набора тегов. означает, что он может сделать только один проход за раз. Я собирался удалить этот ответ, но если это единственный ответ, данный он может быть лучше, чем ничего. Обходной путь будет заключаться в том, что вам придется обновить sh поиск (кнопка над окном поиска) и нажимать кнопку замены снова и снова. Если есть много черточек, это будет раздражать, но лучше, чем отсутствие ответа.


Я возился с Visual Code Studio, и, кажется, следующее работает.

(<translated>(.|\n)*?)(-)((.|\n)*?<\/translated>)

Предполагая, что вы, возможно, захотите, например, заменить da sh, возможно добавив обратно группы 1 и 4, обернутые вокруг любого нового текста ...

$1 <yourTextHere> $4

Пример:

До замены:

enter image description here

После замены (обратите внимание только на 3-4 в первом разделе файла (s), и 3 to 4 не изменяется):

enter image description here



Вариант 2 / Обновление (с использованием скобок. io)

Хотя я не уверен в причине того, что VSCode не соответствует файлам, следующее регулярное выражение работает с скобками (google Brackets.io) для нескольких файлов ...

-(?=[^<]*?<\/translated>) 

Вы должны иметь все свои файлы в папке и открыть папку. Затем поиск в проекте (Find > Find in files). Обратите внимание, что на скриншоте показаны совпадения, найденные во всех файлах. На нижней панели для выбранного файла t2 copy.txt он соответствует сначала в строке 6, а затем в строке 16 и (правильно) не совпадает в строке 10, поскольку он не содержится в переведенном наборе тегов.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...