Find-Expression 的解释

Find-Expression 的解释

我有几个文本文件,其中的内容与以下示例类似:

{
    {
        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

你有两个问题:

  1. 在替换字符串中,\d表示“打印一个d”,仅此而已。所有正则表达式特殊项(如\d\w等)仅在搜索模式中起作用,而不在替换字符串中起作用。
  2. 正如@DavidPostill 所说,Notepad++ 无法在正则表达式搜索/替换中进行数学运算。

你有三种选择来做你想做的事情:

  1. 使用一些程序、脚本或插件来为您进行替换。正如前面提到的评论所说,任何版本都与此无关。
  2. 使用Notepad++搜索并替换3次。
    • 第一轮为个位数,
    • 第二轮取两位数,然后
    • 将第三位数四舍五入为三位数。
  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被第一个捕获组(空格)替换。1700170,并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 的匹配项,该匹配项应为三位数。

相关内容