![](/img/trans.png)
[英]Regular expression to find specific string and replace characters using a certain mask in notepad++
[英]Regular expression to find specific string and add characters when the're not already there in notepad++
好的,我对正则表达式的知识为零,所以如果有人可以引导我找到一种更好的方法来解决这个问题,那么请务必这样做。
我发现一系列文件缺少它们要写入的数据库的特定命名约定。 因此,其中一些可能是dbname1,dbname2,dbname3,abcdbname4,abcdbname5,并且它们都需要在开始时包含该abc。 我想编写一个正则表达式,以查找文件中所有不立即由abc跟随的标签,并添加abc。 有什么想法可以做到吗?
再次,请原谅我措辞/表达不好。 我真的对正则表达式一无所知。 我找不到任何问这个的问题。 我知道有些问题问如何在行中添加字符串,而不是仅在缺少字符串的情况下仅添加到某些行中。
我以为是我写的,但我正在看的像这样的线条
<Name>dbname</Name>
要么
<Name>abcdbname</Name>
我需要让他们所有人在开始时都有那个abc
将\\bdbname(\\d+)
替换为abcdbname\\1
。
\\b
表示“单词边界”,因此它与abc
版本不匹配,但与其他版本匹配。 (...)
括号表示捕获组,捕获组之间的所有匹配项都被捕获到一个编号的变量中,以后可以引用该编号的变量(这里只有一个,因此它位于\\1
)。 \\d+
匹配一个或多个数字字符。
卡梅伦的答案会奏效,但这也会奏效。 称为负向后看。
(?<!abc)(dbname\d+)
此正则表达式查找dbname,后跟1个或多个数字,并且不带abc前缀。 因此它将捕获dbname113。
这将查找没有立即用字符串“ abc”作为前缀的dbname的任何出现。 原始名称位于捕获组\\ 1中,因此您可以将该正则表达式替换为abc\\1
并且所有文件都将正确加上前缀。
并非每个实现正则表达式的程序/语言(众所周知,都是javascript)都支持lookbehinds,但是大多数都支持,而Notepad ++确实支持。 一旦掌握了环顾处(环顾四周/向前看),便非常方便。
?<!
负向后看, ?<=
正向后看/向后看, ?!
否定的lookhead和?= lookahead
都必须在括号中使用,就像我在上面所做的那样,但是它们没有用于捕获,因此它们不会创建捕获组,因此为什么第二组括号可以引用为\\ 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次。 </Name>
,捕获为反向引用4。 通过用\\ 1abc \\ 3 \\ 4替换,您可以将abcname从dbname中删除(如果存在),然后在所有实例中都将dbname替换为abcdbname。
您可以更进一步,
Find: (<Name>)(?:abc)?(dbname\d+)(</Name>)
Replace: \1abc\2\3
在abc
前面加上?:
前缀以创建一个非捕获组,因此用于替换的反向引用是顺序的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.