блокнот ++ и регулярное выражение для двойных слов - PullRequest
0 голосов
/ 26 февраля 2019

У меня около 6000 строк из Android Studio, которые мне нужно изменить.

Мой переводчик допустил большую ошибку и сделал перевод следующим образом

<string name="rej">Отклонено</string> Noraidīts
<string name="com">Выполнено</string> Izpildīts
  <string name="select_img">Выбрать картинку</string> Izvēlēties attēlu
    <string name="select_pic">Выбрать фотографию</string> Izvēlēties fotoattēlu

Как вы можете видетьпереведенное слово добавляется после </string>, поэтому мне нужно вручную взять слово или слова после </string> и поместить их между <string>HERE</string>

. Сделать это вручную довольно сложно.

МожетВы помогаете мне с регулярным выражением в Notepad ++?

Кстати, мне удалось регулярное выражение, если моя строка - одно слово, а переведенная строка - тоже слово Пример:

<string name="rej">Отклонено</string> Noraidīts

Это было сделано с помощью:

(<string name="\w+">)\w+(</string>) (\w+)

Но, если в моей строке есть двойное слово вроде

<string name="select_img">word1 word2</string> word1 word2

Я не знаю правильное регулярное выражение,

Можете ли вы мне помочь, пожалуйста?

Ответы [ 5 ]

0 голосов
/ 26 февраля 2019
  • Ctrl + H
  • Найти что: <string name="\w+">\K.*?(</string>)\h*(.+)
  • Заменить на: $2$1
  • check Обтекание
  • check Регулярное выражение
  • UNCHECK . matches newline
  • Заменить все

Объяснение:

<string name="\w+">     # start tag with variable name
\K                      # forget all we have seen until this position
.+?                     # 1 or more any character but newline, not greedy
(</string>)             # group 1, end tag
\h*                     # 0 or more horizontal spaces
(.+)                    # group 2, 1 or more any character but newline, the translation

Замена:

$2          # content of group 2, the translation
$1          # content of group 1, end tag

Результат для данного примера:

<string name="rej">Noraidīts</string>
<string name="com">Izpildīts</string>
  <string name="select_img">Izvēlēties attēlu</string>
    <string name="select_pic">Izvēlēties fotoattēlu</string>

Экран захвата:

enter image description here

0 голосов
/ 26 февраля 2019

Вот как вы можете создавать группы в Regex ().Вы можете создать столько групп, сколько захотите, а затем вы можете получить значение этой группы, набрав $ 1 для первой группы и т. Д. Поэтому, если вы возьмете это регулярное выражение:

(<string name="\w+">)(\w+)(</string>) (\w+)

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

$1$3$2$4
0 голосов
/ 26 февраля 2019

Если речь идет о символах слова, вы можете повторить группу 0+ раз с пробелом \w+(?: \w+)* или 1+ совпадать с горизонтальным пробелом \h+ вместо только пробела:

(<string name="\w+">)\w+(?: \w+)*(</string>) (\w+(?: \w+)*)

При замене вы можете использовать $1$3$2

Regex demo

0 голосов
/ 26 февраля 2019

Ваше регулярное выражение:

<string name="(.+)">(.+)<\/string> (.+)

Были:

  • группа 1 - это имя
  • группа 2 - это русское слово (а)
  • группа 3 переведено слово (а)

Вы можете проверить это здесь

0 голосов
/ 26 февраля 2019

Проблема с вашим регулярным выражением в том, что вы ищете только символы слова \w, вам также нужно добавить пробел в ваш поисковый набор.Что-то вроде [\w ].Я только что предположил, что могут быть специальные символы, поэтому я заменил ваш \w на .

. Вы можете сделать что-то вроде этого

find:

(<string name=".+">).+(<\/string>) (.+)

заменить на:

\1\3\2

демо здесь: https://regex101.com/r/roi1Yx/3

...