RegEx - 在引号之间查找文本并在括号之间替换

Posted

技术标签:

【中文标题】RegEx - 在引号之间查找文本并在括号之间替换【英文标题】:RegEx - Finding Text Between Quotes and Replacing Between Parentheses 【发布时间】:2013-08-05 01:32:17 【问题描述】:

好的,我正在处理一个包含许多一般对象 ID 的配置文件。

必须编辑所有初始代码,以便添加更多功能,大约 1200 个 ID,我必须手动一个一个地编辑。所以我想也许 Notepad++ 可以使用 RegEx 函数为我完成整个编辑。

但是,问题是我需要从 line 2检索 ID,该 ID 是带引号的,然后将此 ID 放入 line 1 必须在括号之间。此步骤将重复多次,因此下一组将是第 4 行和第 3 行,而不是第 2 行和第 1 行,依此类推。

例子:

Line 1: < InbagCount(11111) />
Line 2: < ItemID="12345" />
Line 3: < InbagCount(11111) />
Line 4: < ItemID="543" />

现在,我需要将所有 11111 替换为下一行的 ItemID。

这是我一直在使用的与 ItemID=""

中的文本匹配的代码
(?<=ItemID=")(?:\\.|[^"\\])*(?=")

它可以找到它们,但是当我单击“替换”按钮时会发生这种情况:

InbagCount(?<=ItemID="?:\.|[^"\]*?=")

也许 Notepad++ 不是这项工作的工具。

有人知道我可以使用什么吗?

提前谢谢,如果你能帮助我,我将不胜感激:)

【问题讨论】:

你是怎么想到那个正则表达式的?它试图匹配一个反斜杠\ 和一个点.。你觉得这有意义吗? 嗯,我在 *** 的某个地方找到了它,它最初用于查找引号之间的 ID。但是在尝试替换时它什么也没做。 查看我的答案,它可以使用带有正则表达式的 Notepad++ 工作 【参考方案1】:

我无法使用 Notepad++ 进行测试,因为我没有 Windows,但如果我正确理解了您的请求,它就是一个简单的正则表达式。关键是跨行边界匹配。您一次匹配两行,对有问题的文本使用捕获组并重建这两行。

因此,例如,您可以匹配:

.*?ItemID="(\d+)" />

并替换为:

< InbagCount($1) />\n< ItemID="$1" />\n

如website 所示。您可以使用该网站实际转换您的代码。

【讨论】:

你先生是我的英雄,有点。你链接的那个网站让我可以做我在记事本++中做不到的事情。出于某种原因,当我输入完全相同的搜索时,即使我勾选了正则表达式,它也不会接受 \n。无论如何,非常感谢。【参考方案2】:

您可以使用 notepad++ 宏来代替正则表达式。将光标放在第二行,按主页然后点击菜单宏>开始录制,然后执行以下步骤:

    ctrl+right_arrow(直到你的号码,可能三次) ctrl+shift+right_arrow ctrl+c(复制) 向上箭头 首页 ctrl+right_arrow(直到你的号码,可能三次) ctrl+shift+right_arrow ctrl+v(粘贴)

然后是stop recording,然后是run macro multiple times &gt; until the end of file &gt; run

【讨论】:

哈哈,虽然这是个聪明的建议,但行不通。原因是 ItemID 有时长 3 个字符,有时长 4 或 5 个字符。感谢您的尝试! 这就是为什么我使用 ctrl,这忽略了长度 大声笑,太神奇了,我不知道 Ctrl 技巧。我想也可以这样做,但另一位绅士也发布了一个使用 RegEx 的解决方案,导致“更少”的工作。不过也谢谢你,这应该可以正常工作!【参考方案3】:

这将在 Windows 上的 Notepad++ 中工作如您所愿

假设这是文本:

< InbagCount(11111) />
< ItemID="12345" />
< InbagCount(11111) />
< ItemID="54321" />

Ctrl+H:

在“查找内容:”\(([0-9]*).*\r\n.*"([0-9]*)"

在“替换为:”中\(\2\) /&gt;\n&lt; ItemID="\2"

这里解释了换行问题:Notepad++ newline in regex

实际上有两个正则表达式捕获,\1 用于 11111 标记,\2 用于 ItemID 编号。不需要 11111 标签的那个。

这有点复杂,但它假定了一些严格性(捕获表达式在第 2 行有效),即

换行符分隔 ItemID 和 InbagCount 行。 替换包含在上一行的括号内 ItemID 用双引号括起来

【讨论】:

以上是关于RegEx - 在引号之间查找文本并在括号之间替换的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript / regex:删除字符串中括号之间的文本[重复]

如何在vi中替换引号之间的文本

JavaScript RegEx:在两个“标记”之间替换字符串中的文本

REGEX - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个

如何在嵌套括号之间获取文本?

在大括号之间搜索和替换文本(VS代码)