正则表达式,用于查找特定字符串,并在notepad ++中不存在时添加字符

时间:2014-11-26 17:36:21

标签: regex notepad++

好吧,我对正则表达式一无所知,所以如果有人能指导我更好地解决这个问题,那么请一定做好。

我发现一系列文件缺少他们将写入的数据库的特定命名约定。所以有些可能是dbname1,dbname2,dbname3,abcdbname4,abcdbname5,它们都需要在开头有这个abc。我想编写一个正则表达式,它将找到文件中的所有标记,这些标记不会立即被abc跟随并添加到abc中。我有什么想法可以做到这一点吗?

再次,请原谅我,如果措辞不力/表达的话。我对正则表达式一无所知。我找不到任何问这个的问题。我知道有些问题询问如何向行添加字符串,但不知道如何在某些已经拥有字符串时仅添加缺少字符串的行。

我以为我写过这个,但我看的是看起来像这样的线条

<Name>dbname</Name> 

<Name>abcdbname</Name> 

我需要让他们全部在开始时拥有那个abc

2 个答案:

答案 0 :(得分:0)

\bdbname(\d+)替换为abcdbname\1

\b表示“字边界”,因此它与abc版本不匹配,但会匹配其他版本。 (...)括号表示一个捕获组,它将中间匹配的所有内容捕获到一个可以在以后引用的编号变量中(这里只有一个,因此它进入\1)。 \d+匹配一个或多个数字字符。

答案 1 :(得分:0)

Cameron的答案会奏效,但这样做也会有效。它被称为负面观察。

(?<!abc)(dbname\d+)

此正则表达式查找dbname后跟1位或更多位数,而不是以abc为前缀。所以它将捕获dbname113。

这会查找任何不会立即以字符串&#34; abc&#34;为前缀的dbname。原始名称位于捕获组\ 1中,因此您可以将此正则表达式替换为abc\1,并且所有文件都将正确添加前缀。

并非每个实现正则表达式(着名的,javascript)的程序/语言都支持lookbehinds,但大多数人和Notepad ++当然都支持。一旦你掌握了它们,Lookarounds(lookbehind / lookaheads)非常方便。

?<!负面的后视,?<=正向后视/后视,?!负面看,以及?= lookahead都必须像我上面所做的那样在parantheses中使用,但他们& #39;不用于捕获,因此它们不会创建捕获组,因此为什么第二组括号可以被引用为\ 1(或1美元,具体取决于语言)

编辑:鉴于一些更好的示例标准,这可能更多是您正在寻找的。

Find: (<Name>)(.*?(?<!abc)dbname\d+)(</Name>)
Replace: \1abc\2\3

或者,更容易理解的东西,你可以这样做或类似的东西:

Find: (<Name>)(abc)?(dbname\d+)(</Name>)
Replace: \1abc\3\4

这是做什么的:

  • 匹配<Name>,捕获为反向引用1.
  • 查找abc并抓取它,如果它作为反向引用2,否则2不包含任何内容。 ?之后的(abc)表示匹配0或1次。
  • 查找dbname并捕获它。并捕获为反向引用3.
  • 匹配</Name>,捕获为反向引用4。

通过替换为\ 1abc \ 3 \ 4,如果存在dbc,则删除abc,并在所有实例中将dbname替换为abcdbname。

您可以更进一步

Find: (<Name>)(?:abc)?(dbname\d+)(</Name>)
Replace: \1abc\2\3

abc前添加?:前缀以创建非捕获组,因此替换的反向引用是顺序的。