我有几个文本文件,其中的内容与以下示例类似:
{
{
1,
text1,
text2,
}
}
{
{
52,
text1,
text2,
}
}
{
{
105,
text1,
text2,
}
}
我想知道如何批量搜索多个文件并替换它们,如下所示:
{
{
17001,
text1,
text2,
}
}
{
{
17052,
text1,
text2,
}
}
{
{
17105,
text1,
text2,
}
}
基本上,我会在每个双开括号后的第一个数字上添加 17,000。我尝试使用 \d\d\d 将数字替换为 17\d\d\d,但它会给我 17ddd,而不是数字。请帮忙
答案1
你有两个问题:
- 在替换字符串中,
\d
表示“打印一个d
”,仅此而已。所有正则表达式特殊项(如\d
和\w
等)仅在搜索模式中起作用,而不在替换字符串中起作用。 - 正如@DavidPostill 所说,Notepad++ 无法在正则表达式搜索/替换中进行数学运算。
你有三种选择来做你想做的事情:
- 使用一些程序、脚本或插件来为您进行替换。正如前面提到的评论所说,任何版本都与此无关。
- 使用Notepad++搜索并替换3次。
- 第一轮为个位数,
- 第二轮取两位数,然后
- 将第三位数四舍五入为三位数。
- 如果你的 Notepad++ 版本高于 v6.0,你可以在正则表达式中使用 PCRE 语法,并使用很好的答案由@ACR 一次性完成所有操作。
要通过三遍方法实现此目的,请使用以下步骤。您可能需要修改搜索模式以捕获您想要的内容,并且只捕获您想要的内容。它们在您上面提供的示例中有效,但您的文件可能比示例更复杂。
第一回合
找到这个:
(\s+)(\d),
替换为:
\11700\2,
第二轮
找到这个:
(\s+)(\d\d),
替换为:
\1170\2,
第三轮
找到这个:
(\s+)(\d\d\d),
替换为:
\117\2,
它能做什么
在Find this
模式中\s+
查找下一个标记之前可以找到的所有空格,至少需要一个空格来防止在除空格之外的任何内容后面匹配数字。围绕()
它的使其成为匹配返回的第一个捕获字符串。\d
匹配一位数字,而组\d\d
和\d\d\d
使其匹配 2 位或 3 位数字,确切地说。再次,将()
其转换为捕获组,这次是第二个。最后匹配,
数字后的逗号,这使它保持在示例文件中的同一行上。
在 中Replace with this
,\1
被第一个捕获组(空格)替换。1700
,170
,并17
打印需要添加到行中的部分。\2
被第二个捕获组替换,即查找模式中的数字。 最后,逗号,
被明确替换,而不是浪费一个捕获组。
答案2
您只需一次查找和替换即可完成此操作。Notepad++ 允许您根据组是否匹配进行条件替换。
找什么:
^(\s*)(\d{3})?(\d{2})?(\d{1})?(,\s*)$
用。。。来代替:
$1(?{2}17$2)(?{3}170$3)(?{4}1700$4)$5
Find-Expression 的解释
从外向内进行:
^
和字符分别$
标记一行的开始和结束。- 匹配
(\s*)
行首的空格,并(,\s*)
匹配行末的逗号和任何尾随空格。 - 中间我们有三个不同的组来匹配 3、2 或 1 位数字(使用语法
{n}
)。每个组后面都有一个 ,?
以将其标记为可能不匹配。组的顺序很重要,因为组是按照它们出现的顺序进行匹配的。如果有三位数字,则第一组将匹配,并且接下来的两组将没有剩余的数字可匹配。如果有两个数字,则第一组将无法匹配,第二组将匹配,并且第一组将没有任何数字可匹配。
Replace-Expression 的解释
- and
$1
将$5
匹配行首的空格以及行末的逗号和空格。 - 以下组(按相反顺序列出)附加“17”加上基于 find 表达式中匹配的组的正确数量的零。例如,取第一个组
(?{2}17$2)
。?{2}
检查组 2 是否匹配。如果是,则插入以下文本:“17”加上组 2 的匹配项,该匹配项应为三位数。