문자열에서 불균형 특수 문자를 감지하는 방법

문자열에서 불균형 특수 문자를 감지하는 방법

가장 좋은 접근 방식이 무엇인지 알고 싶습니다.grep또는확인하다)는 다음을 포함하는 행을 반환합니다.불균형 특수 문자 집합문자열로? 예를 들어, 문자열이 다음과 같은 경우:

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

그리고 지정된 문자가 큰따옴표(")인 경우 이 줄은 반환되지 않습니다. 그러나 내가 찾고 있는 것은 더 복잡하고 왼쪽 대괄호([) 및 오른쪽 사각형과 같은 왼쪽과 오른쪽 균형이 필요합니다. 대괄호(]) if ([) 개수가 (]) 개수와 같지 않으면 행이 반환됩니다. 예:

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

답변1

grepPerl과 유사한 정규식 구현을 지원 함으로써 재귀 정규식 기능을 사용하여 일치 / 쌍이 -P있는 줄을 찾고 반전할 수 있습니다.[]-v

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

요구 사항 [이미 팔로우 중해당 ][foo], 균형 잡힌 것으로 간주되지만 그렇지 않습니다.]foo[

또는 순서가 중요하지 않은 경우:

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

[foo]다시 ]foo[균형을 잡았 지만 [foo여전히 작동하지 않습니다.

이는 실제로 s개와 다른 [s개의 행을 반환합니다. ]이를 달성하는 더 쉬운 방법은 개수를 세는 것입니다.

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

를 사용하면 루프에서 쌍을 제거하고 s 또는 s가 남아 sed있는지 여부를 인쇄할 수 있습니다 .[]

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'

관련 정보