Мне дали замену "\n\1 =\2". Моя задача - создать шаблон поиска, чтобы замена прошла успешно.

Мои данные выглядят так:

There are Spanish translations for some names like Mary (Maria), John (Juan), Michael (Miguel) and Joseph (Jose). 

Моя цель - сделать так, чтобы это выглядело так:

There are Spanish translations for some names like 
Mary = Maria
John = Juan
Michael = Miguel
Joseph = Jose.

Поиск, который у меня был до сих пор, был "есть".|, |. \ И. + (^ [az] \ S)+ (.* \ S)». Даже если первая часть поиска работает, она не группируется правильно, когда приходит замена. Я не знаю, что изменить из поиска или как его следует изменить, чтобы он работал.

2 ответа2

2
  • Ctrl+H
  • Найти что: (\w+)\h+\((\w+)\)\h*(?:,|and)?\h*(\.)?
  • Заменить на: \n$1 = $2$3
  • проверить обернуть
  • проверьте регулярное выражение
  • Заменить все

Объяснение:

(\w+)       # group 1, 1 or more word characters, English name
\h+         # 1 or more horizontal spaces
\(          # openning parenthesis
(\w+)       # group 2, 1 or more word characters, the Spanish name
\)          # closing parenthesis
\h*         # 0 or more horizontal spaces
(?:         # non capture group
    ,       # a comma
  |         # OR
    and     # literally and
)?          # end group, optional
\h*         # 0 or mor horizontal spaces
(\.)?       # group 3, a dot, optional

Замена:

\n          # linefeed, you can use \r\n for windows linebreak
$1          # content of group 1
 =          # space, equal sign, space
$2          # content of group 2
$3          # content of group 3

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

There are Spanish translations for some names like 
Mary = Maria
John = Juan
Michael = Miguel
Joseph = Jose. 

Скриншот:

0

Я не совсем знаком с возможностями поиска и замены Notepad++, но sed Unix очень похож.

Я полагаю, что вы никак не можете получить точный результат, который вы хотите, с точной замененной строкой, которую вы показали, потому что вы хотите пробелы перед испанскими именами ( Maria ,  Juan и т.д.), Но таких входных данных нет текст.  Вам нужно будет добавить хотя бы один пробел в строку замены.

Опция -r указывает sed использовать «расширенные регулярные выражения».  Нам не нужен этот вариант, но

  • sed (по умолчанию) использует ( и ) для сопоставления скобок и \(…\) для захвата группы, в то время как
  • sed -r использует \( и \) для сопоставления буквенных скобок и (…) для захвата группы.

Вы, кажется, ожидаете, что сможете использовать (…) для захвата группы, поэтому я сделаю это с -r .

Вы можете сделать это одной заменой в sed с

sed -r 's/\s([A-Za-z]*)\s\(([A-Za-z]*)\)(,| and)*/\n\1 = \2/g'

Это можно разбить на

sed -r 's/   \s   ([A-Za-z]*)   \s   \(   ([A-Za-z]*)   \)   (,| and)?   /   \n\1 = \2   /g'
  • s/ - начать замену команды.
  • \s - пробел.  В sed вы можете использовать реальные символы пробела; Я подозреваю, что это верно и для Notepad++.  В sed вы также можете использовать [[:space:]] .  Конечно, пробел соответствует только пробелу, но \s и [[:space:]] соответствуют пробелу или табуляции.
  • ([A-Za-z]*) - группа захвата любого количества букв (верхнего или нижнего регистра), чтобы соответствовать английской версии имени.  В sed вы также можете использовать [[:alpha:]] (или [[:upper:]] или [[:lower:]] , по желанию).
  • \s - другое пространство
  • \( - буквальная скобка слева (та, что перед испанской версией названия).
  • ([A-Za-z]*) - то же, что и выше - группа захвата любого количества букв (верхний или нижний регистр), чтобы соответствовать испанской версии имени.
  • \) - буквальная круглая скобка справа (та, что после испанской версии названия).
  • (,| and)? - группа, которая соответствует , или  and , ноль или один раз.  Это соответствует материалу, который находится между правой скобкой после испанской версии имени и следующей английской версией имени.  Нам нужно иметь возможность обрабатывать ноль вхождений этой группы, потому что мы должны соответствовать Joseph (Jose) , даже если после него нет запятой или « and ».
    Обратите внимание, что мы могли бы использовать \sand вместо  and ; Я верю в это  and гораздо более читабелен.  Также обратите внимание, что мы могли бы использовать * (ноль или более, без ограничений) вместо ? ,
  • / - конец строки поиска; начало строки замены.
  • \n\1 = \2 - строка замены (новая строка, первая группа захвата,  =  и вторая группа захвата).  Как упоминалось ранее, я добавил пробелы до и после = .
  • /g - конец команды.  g означает «глобальный» и указывает, что подстановка должна выполняться столько раз, сколько это возможно (по умолчанию используется один раз на строку).

Таким образом, команда Notepad++, вероятно, очень похожа.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .