いきなり答える備忘録

Google Workspace(旧G Suite)・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)カッコが整合しているかチェックする

 Excelで文字列中のカッコの開きと閉じが整合しているか、関数を使って判定してみます。なお判定対象のカッコは1種類のみとします。
 使用する機会はあまりなさそうですが、LAMBDA関数のちょっとした使用例です。

  • SCAN/LAMBDA関数を使って開きカッコと閉じカッコが整合しているかチェックできます。

手順

 画像ではB列に判定対象の文字列が記録されています。
 一方でC3セルに式を入力し、B3セルの文字列内のカッコが整合しているかどうか判定しています。
 以降の行も同様です。

f:id:accs2014:20220405131229p:plain:w780


 さて、そもそもカッコの整合をどう判定するかですが、次のような手順で可能です。

  1. カウンタ(数値)の初期値を0とします。
  2. 文字列を先頭から1文字ずつ調べていき、開きカッコならカウンタに1を加え、閉じカッコならカウンタから1を差し引きます。
  3. カウンタが最初から最後までマイナスにならず、かつ最後に0であればカッコは整合します。そうでなければ整合しません。


 もちろん多数のセルを使えば比較的単純な関数のみで判定を実現できますが、これを1つの式に集約したのがC3セルの式です。

 C3セル

=LET(
x,SCAN(0,MID(B3,SEQUENCE(LEN(B3)),1),LAMBDA(a,b,a+SWITCH(b,"(",1,")",-1,0))),
IF(AND(MIN(x)=0,INDEX(x,ROWS(x))=0),"〇","×")
)

 式が長いので折り返してみました。
 キモとなるのは2段目のSCAN関数の部分です。この中でカウンタの初期値0をaとし、さらにMID/SEQUENCE関数を使って文字列を1文字ずつ分割したものをbとしています。そして「a+SWITCH(b,"(",1,")",-1,0)」により、まずbの1文字目が開きカッコならカウンタに1を加え、閉じカッコなら1を減らし、それ以外の文字なら何も足しません。
 この加減算の結果は次の加減算(bの2文字目を使った加減算)におけるaとして渡されるとともにSCAN関数による出力(配列)の1要素となります。
 これが最後のb(bの最後の文字)まで繰り返されるので、最終的にカウンタの推移を配列として得ることができます。
 あとはLET関数によりこの配列をxと名付け、「xの最小値が0(一度もマイナスにならない)で、かつ最後の値が0」なら〇を、そうでなければ×を表示しています。


 さすがにイメージしにくいかもしれませんので、次の画像では、上記画像の最後の例(文字列)についてSCAN関数の部分のみ適用した結果を示しています。

f:id:accs2014:20220405131233p:plain:w780

 C3セル

=SCAN(0,MID(B3,SEQUENCE(LEN(B3)),1),LAMBDA(a,b,a+SWITCH(b,"(",1,")",-1,0)))

 繰り返しになりますがLAMBDA関数内の「a+SWITCH(b,"(",1,")",-1,0)」という計算が配列bの各要素(つまり文字列内の各文字)について繰り返される、という働きがわかれば理解しやすいと思います。


 なお、この判定問題は複数種のカッコ(例えば通常の丸カッコと波カッコの併用)の整合判定に拡張されます。
 このとき異種のカッコの交錯を考慮する必要があり、例えば「({)}」は×となりますので新たな判定方法を用いる必要があります。いつか追記するかもしれませんが、興味のある方はチャレンジしてみると面白いかもしれません。