记事本++中的搜索模式

ars*_*lan 5 regex text-editor notepad++

1)首先我想搜索一个带有模式的文本,例如

   app(abs(something),abs(something))
Run Code Online (Sandbox Code Playgroud)

在使用 Notepad++ 的大文本中,文本示例如下所示:

app(abs(any length of characters here),abs(any length of characters here)),
tapp(abs(any length of characters here),abs(any length of characters here)),
app(abs(any length of characters here),app(any length of characters here)),
app(abs(any length of characters here),some(any length of characters here)),
app(abs(any length of characters here)) ,abs(any length of characters here))
Run Code Online (Sandbox Code Playgroud)

当我使用“app(abs((. ?)),abs((. ?)))”进行搜索时,它会在上面的示例中找到第一行和第二行。第二行不是我要搜索的。我的表达有什么问题?

2)如果可能,我希望每个“abs”之后的左括号和右括号()应该匹配,例如

   "app(     abs(..(..)..),abs(..(..(...)..)..)   )"
Run Code Online (Sandbox Code Playgroud)

但不像

   "app(abs((), abs())"
Run Code Online (Sandbox Code Playgroud)

其中第一个 abs 具有无与伦比的括号。

请给一些建议!

提前致谢

And*_*rii 4

是的,您应该切换Search ModeRegular expression(在对话框底部Find)并使用正则表达式作为模式。

假设模式中的星号表示任何单个字符,您应该替换*.(匹配正则表达式语法中的任何单个字符)并放在\每个括号之前(()是特殊字符,必须使用转义\)。这样,您将得到:

str1\(str2\(.....\),str2\(........\)\)
Run Code Online (Sandbox Code Playgroud)

为了让它不那么难看,你可以用 5 个点代替.{5}

str1\(str2\(.{5}\),str2\(.{8}\)\)
Run Code Online (Sandbox Code Playgroud)


回答第一部分更新的问题

实际上,上面的模式并没有给出您所描述的结果。.?匹配零个或一个任意字符,括号被解释为特殊符号。因此,您的模式匹配诸如 之类的字符串appabsX,abs

应该这样修改:

app\(abs\((.*)\),abs\((.*)\)\)
Run Code Online (Sandbox Code Playgroud)

它在上面的示例中找到第一行和第二行

t实际上,它找到了和之间第二行的一部分,,这是正确的行为。如果您想忽略这种情况,您应该以某种方式指定您正在搜索的字符串的开头。一些例子:

^匹配行的乞求:

^app\(abs\((.*)\),abs\((.*)\)\)
Run Code Online (Sandbox Code Playgroud)

(\s+) 匹配至少一个空白字符

(\s+)app\(abs\((.*)\),abs\((.*)\)\)
Run Code Online (Sandbox Code Playgroud)

另外,最好通过放置after来启用惰性匹配,如下所示:?*

^app\(abs\((.*?)\),abs\((.*?)\)\)
Run Code Online (Sandbox Code Playgroud)