GoogleスプレッドシートのREGEXEXTRACTが値を抜き出せないときは、入力文字列が違うのか、正規表現が違うのかを分離して調べます。特に改行、全角数字、ハイフンの種類が混在する業務データでは、見た目が似ていても一致しないことがあります。
抽出したい文字列と正規表現を分離する
例えば注文番号がAB-0123の形式で文章に混ざっているとします。A2に発注:AB-0123と入力し、B2で次を試します。
=REGEXEXTRACT(A2,"[A-Z]{2}-[0-9]{4}")
意図した結果はAB-0123です。この例の[A-Z]は半角大文字英字、[0-9]は半角数字、{4}は4桁を指します。REGEXEXTRACTは最初に一致した部分文字列を返すため、複数番号を含む文章から全件抽出する式ではありません。
まずA2のサンプル1件で成立させ、次にほかの行へ展開します。いきなり列全体へ複雑な式を入れて原因を増やさないようにします。
空白・改行・全角半角の違いを見る
AB-0123とAB-0123は文字種が違います。また、ABと-0123の間に改行が入っている場合、先ほどのパターンには一致しません。空白を許すなら、実際の入力仕様を確認したうえで条件を変更します。
改行を除去する試験例は次のとおりです。
=REGEXEXTRACT(SUBSTITUTE(A2,CHAR(10),""),"[A-Z]{2}-[0-9]{4}")
この式は改行を単純に削除するので、改行が本来の区切りであるデータには使わないでください。全角英数字もこの式だけで半角には変わりません。別の正規化処理が必要です。
Googleスプレッドシートの正規表現はRE2を使いますが、Unicode文字クラスの扱いなど制限があります。他言語の正規表現をそのまま貼った式が動くとは限りません。
不一致行だけを一覧にする
エラーを隠して済ませず、C列に抽出結果を置き、D列に失敗フラグを作ると原因を調べやすくなります。
=IF(A2="","",IFERROR(REGEXEXTRACT(A2,"[A-Z]{2}-[0-9]{4}"),"未一致"))
これをC2から行ごとに入れ、C列が未一致の行だけをフィルターします。空セルと抽出失敗を区別するため、入力が空なら結果も空にしています。正常形式でない行を黙って空欄へ置き換えると、検査すべき明細が見えなくなります。
別のサンプルで誤抽出を防ぐ
正常AB-0123、全角AB-0123、桁不足AB-123、文章中に2件ある場合を別々に用意してください。「正常だけ抽出」「不正形式は未一致」「複数件は最初の1件だけ」という期待結果を先に決めます。
番号の位置が決まっているデータなら^と$を使った全体一致パターンも検討できます。ただし文章から番号の部分だけを抽出する場合に全体一致を使うと失敗します。形式検証と部分抽出は目的が違うため、チェック列にREGEXMATCHを使うかも分けて判断します。
