🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

9978閲覧

GoogleスプレッドシートのREGEXMATCH関数で、半角英数字ハイフンのみ、かつ文頭に禁止文字を設定したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2019/10/22 06:44

やりたいこと

半角英数字とハイフン,カンマのみで構成されたオーダー番号だけを入力OKにしたい
また、文頭2文字に関しては禁止パターンを設定したい。(ここではXYとする)
例) 入力OK: AB123456789, Amazon-123
入力不可: XY123456789

入力規則

=REGEXMATCH(TO_TEXT(A1), "^[0-9a-zA-Z,-]+$")

↑こうすることで半角英数字やハイフンカンマのみで区切られたものしか入力を受け付けなくなったが、文頭がXYになっている場合の禁止の方法がわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/10/22 06:59 編集

文頭2文字の禁止パターンについてですが、例の"XY"について、XまたはYは2文字を禁止する、と言う意味でしょうか。(つまり"XY", "YX", "YY", "XX" はNG)それとも"XY"との並びで2文字続いているものは禁止するという意味でしょうか。
退会済みユーザー

退会済みユーザー

2019/10/22 07:01

ありがとうございます。 特定の2文字列"XY"のみを禁止し、"XX","YY"や"YX"に関しては入力OKとしたいです。
guest

回答1

0

ベストアンサー

残念ながら1つの正規表現では実現できませんでした。文字列について否定の正規表現(?!re)が使えれば1つでできると思ったのですが、GASの正規表現の制限で、サポートされていないようです。

(?!re) before text not matching «re» NOT SUPPORTED

RE2 regular expression syntax reference

G Suite Admin Help - Syntax for Regular Expressions

ですので、IF関数と合わせ技で実現してみました。先頭2文字が"XY"なら無条件でNG(FALSE)とし、OKなら"^[0-9a-zA-Z,-]+$"を使う、と言うやり方です。

=IF(REGEXMATCH(TO_TEXT(A1), "^XY"), FALSE, REGEXMATCH(TO_TEXT(A1), "^[0-9a-zA-Z,-]+$"))

Googleスプレッドシート上での実行結果です。
Google Spread Sheet

もう少し上手いやり方があるかもしれませんので、他の方の回答を待ってみても良いかもしれません。


追記しました:2019-10-22 19:39

文字列について否定の正規表現(?!re)が使えれば1つでできると思ったのですが、

Googleスプレッドシート上では適いませんでしたが、(?!re)が使える別のプログラミング言語なら本当にできるか気になったので、Perl5の以下のコードで確認しました。正規表現としては ^(?!.*XY)^[0-9a-zA-Z,-]+$ になります。他のプログラミング言語でもこれで行けるはずです。

Perl5

1# perl v5.26.3 2while (<>) { 3 if (/^(?!.*XY)^[0-9a-zA-Z,-]+$/) { 4 print; 5 } 6}

実行例:

bash

1$ cat data.txt 2AB123456789 3Amazon-123 4XY123456789 5YX123456789 6XX123456789 7YY123456789 8Amazon+123 9Amazon!123 10 11$ perl t1.pl data.txt 12AB123456789 13Amazon-123 14YX123456789 15XX123456789 16YY123456789

。。。ご要望を満たせているようです。以上、ご参考まで。

投稿2019/10/22 07:56

編集2019/10/22 10:39
dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/22 08:33

ありがとうございます。 正規表現一行で解決することに凝り固まっていたのでIF関数で回避できると思い至りませんでした。 処理数も1日数行追加されていくだけで高速化は求めていなかったので、どどさんの手法を使わせていただきます。とても速い回答ありがとうございます!
退会済みユーザー

退会済みユーザー

2019/10/22 08:36

ありがとうございます! 正規表現一つだけで解決することに凝り固まっていたので、IF関数で解決していただいてスッキリしました。 処理回数もそんなに多くない部分ですので、どどさんの手法を使わせていただきます。 とても速い回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問