繁体   English   中英

正则表达式可查找特定的字符串并在记事本++中尚不存在时添加字符

[英]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次。
  • 查找dbname并捕获它。 并捕获为反向引用3。
  • 匹配</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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM