【问题标题】:RegEx - Finding Text Between Quotes and Replacing Between ParenthesesRegEx - 在引号之间查找文本并在括号之间替换
【发布时间】: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++ 不是这项工作的工具。

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

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

【问题讨论】:

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

标签: regex replace find quotes parentheses


【解决方案1】:

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

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

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

并替换为:

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

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

【讨论】:

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

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

  1. ctrl+right_arrow(直到你的号码,可能三次)
  2. ctrl+shift+right_arrow
  3. ctrl+c(复制)
  4. 向上箭头
  5. 首页
  6. ctrl+right_arrow(直到你的号码,可能三次)
  7. ctrl+shift+right_arrow
  8. 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 用双引号括起来

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 2022-01-02
    • 1970-01-01
    • 2013-11-15
    • 2012-03-05
    • 2015-11-09
    • 2011-02-09
    • 2012-11-14
    相关资源
    最近更新 更多