好吧,我对正则表达式一无所知,所以如果有人能指导我更好地解决这个问题,那么请一定做好。
我发现一系列文件缺少他们将写入的数据库的特定命名约定。所以有些可能是dbname1,dbname2,dbname3,abcdbname4,abcdbname5,它们都需要在开头有这个abc。我想编写一个正则表达式,它将找到文件中的所有标记,这些标记不会立即被abc跟随并添加到abc中。我有什么想法可以做到这一点吗?
再次,请原谅我,如果措辞不力/表达的话。我对正则表达式一无所知。我找不到任何问这个的问题。我知道有些问题询问如何向行添加字符串,但不知道如何在某些已经拥有字符串时仅添加缺少字符串的行。
我以为我写过这个,但我看的是看起来像这样的线条
<Name>dbname</Name>
或
<Name>abcdbname</Name>
我需要让他们全部在开始时拥有那个abc
答案 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美元,具体取决于语言)
编辑:鉴于一些更好的示例标准,这可能更多是您正在寻找的。 p>
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次。</Name>
,捕获为反向引用4。通过替换为\ 1abc \ 3 \ 4,如果存在dbc,则删除abc,并在所有实例中将dbname替换为abcdbname。
您可以更进一步
Find: (<Name>)(?:abc)?(dbname\d+)(</Name>)
Replace: \1abc\2\3
在abc
前添加?:
前缀以创建非捕获组,因此替换的反向引用是顺序的。