質問: 少し強引な書き方になりましたが、"正規表現"で分からない箇所がありますので、 よろしくお願いします。 下記のコードは、平成以降の元号が"元年",もしくは"1桁"の場合は、レッドを表示し、 元号が"2桁"の場合は、グリーンを表示,その他の場合は、ブルーを表示させようと したものです。 現在は"平成30年"なので、グリーンで表示するかと思っていたら、ブルーで表示されます。 書き方が間違っているのでしょうか。chromeのデベロッパーツールでも、エラーは でませんが、どのように書けば、グリーンに表示させられるでしょうか。 ``` ```
回答: ショートアンサー `metropolis` さんのご指摘の通り `String.prototype.match()` を使用する場合は、 `Gengou == [2-9]` を `Gengou.match(/平成[1-9]年/)` `Gengou == [1-9][0-9]` を `Gengou.match(/平成[1-9][0-9]年/)` に修正してみてください。 (古い版で `=~` という記述を使った答えを書いてしまっていましたが、 対象のプログラミング言語を勘違いしていました。ごめんなさい。) ロングアンサー 正規表現を意図した記述と思いますが、実際には `[2-9]` は `[-7]` (要素として `-7` を含む配列)となり、 `[1-9][0-9]` は `[-8][-9]` (要素として `-8` を含む配列の -9 番目の要素。つまり `undefined` )として解釈されてしまいます。 (JavaScript の「配列」についてご存知なければ下記を参照ください。 ) よって if, else if 文の条件式はそれぞれ `'平成30年' == [-7]` `'平成30年' == undefined` となり、どちらにもマッチせず、 else 節が実行されブルーが表示されます。 `/(^|[^\d])1(?=$|[^\d])/` の箇所でもわかりますが、 JavaScript において正規表現リテラルは `/.../` の書式で記述する必要があります。 詳しくは 等をご確認ください。 また問題のコードですと、平成元年の場合 `Gengou` 変数も `'平成元年'` となりますので `Gengou == "元年"` も `Gengou == "平成元年"` とするのが正確です。 ついでに `条件A && 条件B` は「条件A **かつ** 条件B が満たされた場合」の意なので、 「"元年", **もしくは** "1桁"の場合」としたい場合、 `条件A || 条件B` とする必要があります。 つまり `(Gengou == "元年")&&(Gengou == [2-9])` 箇所は `(Gengou == "平成元年")||(Gengou.match(/平成[1-9]年/))` とすれば、 意図した通りの挙動になるはずです。 以上、ご確認ください。