我正在尝试匹配shell脚本中的行,即定义一个函数,该函数名称后有一个左大括号,这样regex只返回左大括号而不返回其他内容。
function {
...
}
左大括号后可能有尾随注释功能
{ # trailing comment
这在表达式中应该是允许的。否则,正则表达式必须剔除所有其他行中留有大括号的实例,其中这些实例不是函数的大括号,并返回";没有匹配";。我正在尝试以下操作:
~/ % pcretest
PCRE version 8.45 2021-06-15
re> "^[^$]*({)+(?!W+w+)s*#?"
data> {
0: {
1: {
data> abc {
0: abc {
1: {
data> abc { #
0: abc { #
1: {
data> abc ${ #
No match
data> abc { # abc
No match
data>
你看,它运行得很好,除了上次尝试的匹配
data> abc { # abc
它返回";没有匹配";,但我希望它匹配,而我不希望它匹配:
data> abc { abc
分解正则表达式:
"^[^$]*({)+(?!W+w+)s*#?"
- 锚定在线路的起点
- 如果美元符号在下面的左大括号之前,则返回"0";没有匹配">
- 否定先行:忽略大括号后的任何空白和任何适当的单词
- 后面跟零个或多个空格和可能的"#">
有什么帮助吗?
我想我找到了解决方案:
^.*?^[^$]*({)+(?!sw)#?
这将像这样匹配(也不匹配(:
~/ % pcretest
PCRE version 8.45 2021-06-15
re> "^.*?^[^$]*({)+(?!sw)#?"
data> {
0: {
1: {
data> abc {
0: abc {
1: {
data> abc { # def
0: abc {
1: {
data> ${
No match
data> abc { def
No match
这正是我想要的。