残念ながら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スプレッドシート上での実行結果です。
もう少し上手いやり方があるかもしれませんので、他の方の回答を待ってみても良いかもしれません。
追記しました: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
。。。ご要望を満たせているようです。以上、ご参考まで。