【问题标题】:Regular expression to find specific string and add characters when the're not already there in notepad++正则表达式查找特定字符串并在记事本++中不存在时添加字符
【发布时间】:2014-11-27 13:04:02
【问题描述】:

好的,我对正则表达式的了解为零,所以如果有人可以指导我找到更好的方法来解决这个问题,那么请务必这样做。

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

再次,如果这措辞/表达不当,请原谅我。我对正则表达式的了解真的是零。我找不到任何要问这个的问题。我知道有一些问题询问如何将字符串添加到行中,而不是如何仅添加到缺少字符串的行中,而某些行已经有了它。

我以为我已经写了这个,但我正在查看看起来像这样的行

<Name>dbname</Name> 

<Name>abcdbname</Name> 

我需要让他们都在开头有那个 abc

【问题讨论】:

  • 我编辑了您的帖子,以便为您正确编码格式。您可以通过按编辑器中的 {} 按钮(将文本缩进四个空格/制表符)进行代码格式化,或者您可以通过在 backticks 中环绕文本来执行 inline &lt;code&gt; formatting(撇号字符接下来到您的 1 键)

标签: regex notepad++


【解决方案1】:

Cameron 的回答会奏效,但这个也会奏效。这被称为消极的追溯。

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

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

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

并非所有实现正则表达式(著名的 javascript)的程序/语言都支持后向查找,但大多数都支持,Notepad++ 肯定支持。一旦你掌握了环视(lookbehind/lookaheads)的窍门,就会非常方便。

?&lt;!negative lookbehind、?&lt;=positive lookbehind/lookbehind、?!negative lookhead 和 ?= lookahead 都必须像我上面所做的那样在括号中使用,但它们不用于捕获,所以它们不要创建捕获组,因此为什么第二组括号可以被引用为 \1 (或 $1 取决于语言)

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

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

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

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

这是做什么的:

  • 匹配 &lt;Name&gt;,捕获为反向引用 1。
  • 寻找abc 并捕获它,如果它作为反向引用2 存在,否则2 不包含任何内容。 (abc) 后面的 ? 表示匹配 0 次或 1 次。
  • 查找 dbname 并捕获它。并捕获为反向引用 3。
  • 匹配 &lt;/Name&gt;,捕获为反向引用 4。

通过替换为 \1abc\3\4,您可以将 abc 从 dbname 中删除(如果存在)并在所有实例中将 dbname 替换为 abcdbname。

你可以更进一步,

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

abc 前加上?: 以创建非捕获组,因此用于替换的反向引用是连续的。

【讨论】:

  • 那么如果 dbname1 dbname2 只是占位符并且名称可以是任意字符组合并且只需要以该字符串开头呢?
  • @David 我想每个人都这么想。您可能必须发布一些示例,但这可能会让您得到您想要的。 (&lt;Name&gt;)(.*?(?&lt;!abc)dbname)(&lt;/Name&gt;) 可以替换为 \1abc\2\3
【解决方案2】:

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

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

【讨论】:

  • 那么如果 dbname1 dbname2 只是占位符并且名称可以是任意字符组合并且只需要以该字符串开头呢?
  • 如果它们可以是任意的字符组合,那么你如何将它们与其他单词区分开来呢?一定有什么独特之处! :-)
猜你喜欢
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
相关资源
最近更新 更多