捕获

捕获

我需要在 Notepad++ 中查找和替换方面的帮助。

例子:

$250 ‘Hello 1’ 拍‘____’

500 美元《Hello 2》拿下《____》

1000 美元《Hello 3》拿下《____》

想象一下,有数千个这样的条目到达‘Hello 9999’。

我想用数字替换“____”,而不改变“Hello 1”或“Hello 2”。

我希望的结果是:

250 美元的《Hello 1》

500 美元的《你好2》拿下《500》

1000 美元的《Hello 3》拿下《1000》

我该怎么做呢?我希望使用正则表达式。

答案1

勾选正则表达式复选框并使用:

搜索:

\$(.*?) (.*?) Take '(.*?)'

代替:

\$$1 $2 Take '$1'

这将搜索基本上如下所示的行:

$anything anything Take 'anything'  

.*? 表示正则表达式中除换行符之外的任何字符。
用括号括住捕获组(例如 .*?)会将其内容存储在变量 $n 中,其中 n 是第 n 个组。

因此搜索后我们将有三个变量:
$1 = 250 $2 = 'Hello 1' $3 = ___

使用替换,我们用 \$ 替换实际的整行(转义美元符号使其成为文字 $ 而不是变量)。
整行被替换为 $$1 $2 '$1'
正如您所见,我们再次使用 $1 变量,它是第一个捕获组。


我对 SO 还很陌生,如果我的解释不是很好,那么很抱歉。

答案2

这应该是 Notepad++ 语法,选择了“查找/替换”对话框底部的“正则表达式”单选按钮:

Find:  (\$(\d+).*Take\s+').*(')
Replace:  \1\2\3

解释:

括号内的变量按从左到右的顺序排列:

(\$(\d+).*Take\s+').*(')
|--------1--------|
   |-2-|             |3|

\$ :表示查找美元符号

\d+ :表示查找数字,末尾的“+”表示一个或多个(即必须至少有一个数字)。

.* :“.”表示任意字符,“*”表示一个或多个。

拿:来说,它只是特指文本这个词。

\s+ :表示空格字符,“+”表示一个或多个。

...

现在,因为除了单引号中的最后一个字符之外的所有内容都已分组,所以:

\1\2\3

只需放置第一个和第三个括号,第二个括号位于中间(其中第二个括号是美元价值)。

答案3

尝试这个

首先打开正则表达式

Notepad++ 设置启用正则表达式

https://regex101.com/r/aW4gG2/2

查找:(\$\d+)(.*Take ')(.*)(')
替换:\1\2\1\4

捕获

此表达式有四组

输入:$250 'Hello 1' Take '____'

第 1 组
(\$d+)= $250- 这表示以 $(转义为文字)开头,然后是数字(\d)1 或更多,因此它会在最后一位数字处停止,无论是 3 还是 15。在您的示例中,它们位于行首,但我不认为如此。但是,如果它们确实位于行首,那么您可能需要添加^一个^(\Sd+)

第 2 组
(.*Take ')= 'Hello 1' Take '-表达式表示.*任意字符任意次数,因此它会获取所有内容直到它看到Take然后它获取Take '因为我写出来并停在那里。

第 3 组
(.*)= -____这占用了内部空间,基本上占用 0 次或更多次。在这种情况下,它都是下划线,但写下来它会抓取那里的所有内容。它会抓取行尾的所有内容,但我后面有一些东西告诉它何时停止

第 4 组
(')=——'这告诉第 3 组在标记处停止'。它还会捕获'自己组中的标记以进行重新排列。

代换

\1\2\1\4

组从其左括号开始编号,但在这种情况下,一切都是线性的,没有嵌套,所以很明显。\1\2\3\4会让一切保持原样。但我们想用第一组替换第三组,所以……\1\2\1\4就成功了。这里的关键点之一是确保我们捕获第四组以在最后替换它。除此之外没有什么太棘手的。

执行

因此,只需在“查找替换”中进行设置,然后点击“全部替换”,这样就可以解决问题。

编辑

我注意到您想去掉替换中的 $,因此您需要对我最初的建议做一些小的修改,尽管它基本上是相同的。

输入:$250 'Hello 1' Take '____'

查找:(\$)(\d+)(.*Take ')(.*)(')
替换:\1\2\3\2\5

相关内容