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 > until the end of file > 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\) />\n< ItemID="\2"
这里解释了换行问题:Notepad++ newline in regex
实际上有两个正则表达式捕获,\1
用于 11111 标记,\2
用于 ItemID 编号。不需要 11111 标签的那个。
这有点复杂,但它假定了一些严格性(捕获表达式在第 2 行有效),即
换行符分隔 ItemID 和 InbagCount 行。 替换包含在上一行的括号内 ItemID 用双引号括起来【讨论】:
以上是关于RegEx - 在引号之间查找文本并在括号之间替换的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript / regex:删除字符串中括号之间的文本[重复]
JavaScript RegEx:在两个“标记”之间替换字符串中的文本