Notepad ++:如何正确分组以便替换有效

Notepad ++:如何正确分组以便替换有效

我被要求替换“\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.

到目前为止,我进行的搜索是“are.|,.|\and. + (^[az]\S)+(.*\S)”。即使搜索的第一部分有效,当替换出现时,它也无法正确分组。我不知道要从搜索中更改什么,也不知道应该如何更改才能使其正常工作。

答案1

  • Ctrl+H
  • 找什么:(\w+)\h+\((\w+)\)\h*(?:,|and)?\h*(\.)?
  • 用。。。来代替:\n$1 = $2$3
  • 检查环绕
  • 检查正则表达式
  • Replace all

解释:

(\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. 

屏幕截图:

在此处输入图片描述

答案2

我对 Notepad++ 的搜索和替换功能不是特别熟悉,但 Unix 的功能sed非常相似。

我相信你不可能得到精确的您想要的结果精确的您展示的替换字符串,因为您希望在西班牙语名称( 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++ 命令可能非常相似。

相关内容