我认为我们需要的是一个负的前瞻,这在其他语言中类似于:第一个月这不适用于Vim的regex样式,使用\v标志似乎也没有帮助。
\v
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。
yqhsw0fo2#
答案与双引号字符串和单引号有关。第一个月以上不考虑负前瞻,而以下将考虑:execute 's/,\([^\[]*\]\)\@!/,\r/g'个
execute 's/,\([^\[]*\]\)\@!/,\r/g'
pgky5nke3#
要将括号[]中的所有逗号,替换为-,可以这样做:等等,等等,等等:%s/,\|\(\[.\{-}\]\)/-\1/g个等等等等:%s/-\[/[/g个等等等等
[]
,
-
:%s/,\|\(\[.\{-}\]\)/-\1/g
:%s/-\[/[/g
3条答案
按热度按时间quhf5bfb1#
如果满足以下两个假设,则可以这样做:
字符串
是带有嵌套括号的字符串的示例。给定第一个假设,第二个意味着每个左括号后面是一个右括号,中间没有左括号,每个右括号前面是一个左括号,中间没有右括号。这是一个平衡括号的例子:
型
以下是非嵌套不平衡括号的示例:
型
请注意,在第二个示例中,括号是不平衡的,即使左括号的数量(1)等于右括号的数量。在第三个例子中,最后的
']'
前面有一个左括号,但中间有一个']'
。这两个假设允许我们匹配每个逗号,它后面没有一个右括号,前面没有一个左括号。为此,我们可以使用一个包含字符类的负向前查找,该字符类匹配除左括号之外的每个字符。使用PCRE(PHP)正则表达式引擎,它将是:
型
我被可靠地告知(见评论),在Vim中,这将是:
型
Vim和大多数其他语言都支持否定lookaheads。
Demo
正则表达式执行以下操作:
型
看起来一个选择是在Vim中使用另一个正则表达式引擎。例如,参见Q&A。
yqhsw0fo2#
答案与双引号字符串和单引号有关。
第一个月
以上不考虑负前瞻,而以下将考虑:
execute 's/,\([^\[]*\]\)\@!/,\r/g'
个pgky5nke3#
要将括号
[]
中的所有逗号,
替换为-
,可以这样做:等等,等等,等等
:%s/,\|\(\[.\{-}\]\)/-\1/g
个等等等等
:%s/-\[/[/g
个等等等等