【问题标题】:Notepad++ Regex Find/Replace Using Look Behind not WorkingNotepad++ 正则表达式查找/替换使用 Look behind 不起作用
【发布时间】:2016-03-09 19:59:34
【问题描述】:

我有以下 CSS 标记。

.previous-container{
    float:left;
}
.primary-commands {
    float:right;
}

使用正则表达式语法搜索 (?<=[\s,;])([a-zA-Z\-]+): 它会按预期突出显示 CSS 属性名称,但是,单击替换时不会替换任何内容。我尝试在替换行中使用组标记语法,例如$[nth group] 和任何纯文字字符串替换。无论我的尝试如何,它都不会用任何东西替换匹配的字符串。我正在使用记事本++ 6.7.5 版。也许我在这里遗漏了一些明显的东西?

【问题讨论】:

  • 如果您不想陷入疯狂(npp 有时会有完全疯狂的行为),请使用 PHP 和 sabberworm:github.com/sabberworm/PHP-CSS-Parser/tree/master/lib/Sabberworm/…
  • 是的,对我来说似乎是一个错误。我认为,前瞻和负后瞻似乎可以正常工作,如果您点击“全部替换”,或者如果您将文本切成两半以便只找到一个匹配项,那么您的示例似乎可以正常工作。
  • 在文本编辑器 UltraEdit v22.20 中使用 Perl 正则表达式替换 (?<=[\s,;])([a-zA-Z\-]+): 没有问题。在记事本++中使用作为搜索字符串([\s,;])([a-zA-Z\-]+): 并开始用$1 替换字符串怎么样,即使用捕获组来捕获必须存在于字符串左侧的字符才能真正找到并在开始时在替换字符串中反向引用该字符以保留它替换时未修改?
  • @Mofi,我喜欢这样的解决方法。由于它在开始时是一组匹配的组(而不是可变数量的匹配组),这应该可以满足我的需要。谢谢。
  • @femtoRgon 我没有尝试“全部替换”按钮,很好的观察。这听起来可能是解决此问题的另一种方法。我使用单次替换来监控替换以确保它正常工作。这个正则表达式只是我试图在 1000 多行 CSS 文件上使用的更大表达式的一部分。

标签: regex search replace notepad++ lookbehind


【解决方案1】:

基于原始问题的 cmets,这里有一些解决我的问题的解决方法。

选项#1

将正则表达式(?<=[\s,;]) 的lookbehind 部分替换为简单的非lookbehind 组匹配语句,例如([\s,;])。这将继续将搜索结果限制为以后向指定字符开头的字符串。唯一需要注意的是,在我的替换字符串中,例如$1 $2 我需要删除不应该成为替换字符串一部分的不想要的匹配字符。

选项#2

使用“全部替换”按钮。当在您的正则表达式语句中使用正向回溯而不是使用“替换”按钮进行单个替换时,它将正确执行替换。

我选择选项 #1 只是因为它可以满足我的需要,同时允许我一次仍然执行一个替换。对于较大的文档,在彻底测试我的正则表达式之前,我不想使用“全部替换”。

【讨论】:

  • 我使用了选项 #2,它与“全部替换”按钮一起使用,但我无法弄清楚为什么普通的“替换”按钮无法替换组。跨度>
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2015-01-11
相关资源
最近更新 更多