Vim正则表达式匹配所有不在方括号内的逗号

0yycz8jy  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(140)

我认为我们需要的是一个负的前瞻,这在其他语言中类似于:
第一个月
这不适用于Vim的regex样式,使用\v标志似乎也没有帮助。

quhf5bfb

quhf5bfb1#

如果满足以下两个假设,则可以这样做:

  • 没有嵌套括号;和/或
  • 支架是平衡的。
ab,c[de[fg,h]i j]k,m

字符串
是带有嵌套括号的字符串的示例。给定第一个假设,第二个意味着每个左括号后面是一个右括号,中间没有左括号,每个右括号前面是一个左括号,中间没有右括号。这是一个平衡括号的例子:

ab[cd,ef]g,h[ij]k


以下是非嵌套不平衡括号的示例:

ab[cd
ab][cd
ab[cd]e]


请注意,在第二个示例中,括号是不平衡的,即使左括号的数量(1)等于右括号的数量。在第三个例子中,最后的']'前面有一个左括号,但中间有一个']'
这两个假设允许我们匹配每个逗号,它后面没有一个右括号,前面没有一个左括号。为此,我们可以使用一个包含字符类的负向前查找,该字符类匹配除左括号之外的每个字符。使用PCRE(PHP)正则表达式引擎,它将是:

,(?![^[]*])


我被可靠地告知(见评论),在Vim中,这将是:

,\([^[]*]\)\@!


Vim和大多数其他语言都支持否定lookaheads。
Demo
正则表达式执行以下操作:

,         # match ','
(?!       # begin negative lookahead
  [^[]*   # match 0+ characters other than '['
  ]       # match ']'
)         # end negative lookahead


看起来一个选择是在Vim中使用另一个正则表达式引擎。例如,参见Q&A

yqhsw0fo

yqhsw0fo2#

答案与双引号字符串和单引号有关。
第一个月
以上不考虑负前瞻,而以下将考虑:
execute 's/,\([^\[]*\]\)\@!/,\r/g'

pgky5nke

pgky5nke3#

要将括号[]中的所有逗号,替换为-,可以这样做:
等等,等等,等等
:%s/,\|\(\[.\{-}\]\)/-\1/g
等等等等
:%s/-\[/[/g
等等等等

相关问题