找到一个字符串并替换它之前的模式 - Notepad ++

时间:2016-12-08 02:03:15

标签: regex string replace pattern-matching notepad++

我试图用记事本++实现这一点

输入文件有模式
<代码片段语句 - 这是变量,后跟...> (括号内的质量)

-- "command xyz d 
   command rererere 
   command ;" ( fair quality)
---- "command xyz d 
   command rereredfdfdre 
   command ffdfdfdf ;" ( good quality)
---- "command xffddyz d 
   command rerfdferere 
   command ;" ( good quality)
----"command fdfdfxyz d 
   command refffdrerere 
   command fdfdff;" (    fair quality)

我想做的是什么 - 查看( fair quality )的所有实例(请注意( and fair之间的间距是可变的,然后使用( fair quality )删除整个语句
o / p是这样的:

---- "command xyz d 
   command rereredfdfdre 
   command ffdfdfdf ;" ( good quality)
---- "command xffddyz d 
   command rerfdferere 
   command ;" ( good quality)

我尝试了一些基本的正则表达式替换搜索( fair quality)但是如何删除from x to y之前的整个字符串?
请不要认为间距模式是规则的。它会改变 例如

"command    xyz..(   fair quality);"
"command  xyz (fair quality   );"

2个字符串之间的间距没有任何规律性,这可以用于正则表达式工作。
有时也会有不必要的换行符,例如。

"command    
xyz..(   fair 
quality);"

所以行结束假设也无济于事 所以精确的正则表达式逻辑将是 - 去找我fair的实例 - 在command的实例之前找到fair的第一个实例 - 在"之前找到command的第一个实例。我们将此称为X - 在"之后找到fair的第一个实例。我们将此称为Y - 从X删除至Y

2 个答案:

答案 0 :(得分:1)

你需要temper greedy token solution

的正则表达式

找到

-*\s*"command\b((?!\bquality\b\s*\)).)*\(\s*fair\s+quality\s*\)(;")?\r?\n?

替换为空,确保正则表达式与.匹配换行符

正则表达式详情:

  • -*\s*"command\b - 匹配“before command
  • 的第一个实例
  • ((?!\bquality\b\s*\)).)* - 匹配任何不属于的字符 quality)脾气贪婪的令牌
  • \(\s*fair\s+quality\s*\)(;")?\r?\n? - 匹配fair quality部分, 包括;"和背后的新行

输入测试

-- "command xyz d 
   command rererere 
   command ;" ( fair quality)
---- "command xyz d 
   command rereredfdfdre 
   command ffdfdfdf ;" ( good quality)
---- "command xffddyz d 
   command rerfdferere 
   command ;" ( good quality)
----"command fdfdfxyz d 
   command refffdrerere 
   command fdfdff;" (    fair quality)
  ----"command fdfdfxyz d 
   command refffdrerere 
command    
xyz..(   fair 
quality);"
"command    xyz..(   fair quality);"
"command  xyz (fair quality   );"

输出

---- "command xyz d 
   command rereredfdfdre 
   command ffdfdfdf ;" ( good quality)
---- "command xffddyz d 
   command rerfdferere 
   command ;" ( good quality)

答案 1 :(得分:1)

你可以这样做:

  • 找到:-+\s*"[^"]+?"\s*\(\s*fair quality\)
  • 替换为:NOTHING
  • 全部重新

<强>解释

-+              : one or more dash
\s*             : 0 or more spaces
"               : a double quote
[^"]+?          : one or more any character that is not a double quote
"               : a double quote
\s*             : 0 or more spaces
\(              : an open parenthesis
\s*             : 0 or more spaces
fair quality    : literally 'fair quality'
\)              : a close parenthesis