如何检测字符串中不平衡的特殊字符

如何检测字符串中不平衡的特殊字符

我想知道最好的方法是什么(可能使用grep或者确认) 返回包含以下内容的行不平衡的特殊字符集在一个字符串中?例如,如果字符串是:

bqM#+t1U"OyBGhk]ozVG[v"&

并且指定的字符是双引号(“),则不会返回此行。但是,我要查找的内容更复杂,需要左右平衡,例如左方括号([)和右方括号 (]) 如果 ([) 的数量不等于 (]) 的数量,则返回该行,例如:

i],U2y.2<i*gZCl>y[A~a`^[

答案1

通过grep支持类似 perl 正则表达式的实现-P,您可以使用它们的递归正则表达式功能来查找具有匹配[/]对的行,并用于-v反转:

grep -Pxv '((\[(?1)\]|[^][])*+)'

要求[已关注相应的]ie[foo]被认为是平衡的,但不是]foo[

或者如果顺序不重要:

grep -Pxv '((\[(?1)\]|\](?1)\[|[^][])*+)'

[foo]]foo[平衡了,[foo还是不行。

这实际上返回了[s 数量与]s 数量不同的行。实现这一目标的一种更简单的方法就是对它们进行计数。

perl -lne '$l = () = /\[/g; $r = () = /\]/g; print if $l != $r'
awk 'gsub(/\[/, "&") != gsub(/\]/, "&")'

使用sed,您可以消除循环中的对,并打印是否还有剩余[s 或]s:

sed -e 'h;:1' -e 's/\[\(.*\)\]/\1/g;s/\]\(.*\)\[/\1/g;t1' -e '/[][]/!d;g'

或者如果顺序很重要:

sed -e 'h;:1' -e 's/\[\([^][]*\)\]/\1/g;t1' -e '/[][]/!d;g'

相关内容