44632


少し強引な書き方になりましたが、"正規表現"で分からない箇所がありますので、  
よろしくお願いします。

下記のコードは、平成以降の元号が"元年",もしくは"１桁"の場合は、レッドを表示し、  
元号が"２桁"の場合は、グリーンを表示，その他の場合は、ブルーを表示させようと  
したものです。  
現在は"平成30年"なので、グリーンで表示するかと思っていたら、ブルーで表示されます。  
書き方が間違っているのでしょうか。chromeのデベロッパーツールでも、エラーは  
でませんが、どのように書けば、グリーンに表示させられるでしょうか。

[code]

    <SCRIPT type="text/javascript">
     <!--
    var now=new Date();
    var Gengou = now.toLocaleDateString("ja-JP-u-ca-japanese", { era: "long", year:"numeric" })
        .replace(/(^|[^\d])1(?=$|[^\d])/, '$1元').replace(/\u200e/g, "").replace(" ", "");
    
    if((Gengou == "元年")&&(Gengou == [2-9])){//元号が"元年",もしくは"１桁"の場合は、レッドを表示。
      document.write("<p>");
      document.write("<span style='color:red'>");
      document.write(Gengou);
      document.write("</span>");
      document.write("</p>");
    }
    else if(Gengou == [1-9][0-9]){//元号が"２桁"の場合は、グリーンを表示。
      document.write("<p>");
      document.write("<span style='color:green'>");
      document.write(Gengou);
      document.write("</span>");
      document.write("</p>");
    }
    else{//その他の場合は、ブルーを表示。
      document.write("<p>");
      document.write("<span style='color:blue'>");
      document.write(Gengou);
      document.write("</span>");
      document.write("</p>");
    }
    //-->
    </script>
    
[/code]


CC BY-SA 4.0
2018-06-08T14:02:18.113
44624
2018-06-08T15:25:26.577
2018-06-08T15:25:26.577
28531
28531
question
javascript 正規表現
正規表現で、2桁を表す書き方について


ショートアンサー

`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 の「配列」についてご存知なければ下記を参照ください。  
<https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array>
）

よって if, else if 文の条件式はそれぞれ `'平成30年' == [-7]`  
`'平成30年' == undefined` となり、どちらにもマッチせず、  
else 節が実行されブルーが表示されます。

`/(^|[^\d])1(?=$|[^\d])/` の箇所でもわかりますが、  
JavaScript において正規表現リテラルは `/.../` の書式で記述する必要があります。  
詳しくは
<https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions>
等をご確認ください。

* * *

また問題のコードですと、平成元年の場合 `Gengou` 変数も `'平成元年'` となりますので  
`Gengou == "元年"` も `Gengou == "平成元年"` とするのが正確です。

ついでに `条件A && 条件B` は「条件A **かつ** 条件B が満たされた場合」の意なので、  
「"元年", **もしくは** "1桁"の場合」としたい場合、 `条件A || 条件B` とする必要があります。

つまり `(Gengou == "元年")&&(Gengou == [2-9])` 箇所は  
`(Gengou == "平成元年")||(Gengou.match(/平成[1-9]年/))` とすれば、  
意図した通りの挙動になるはずです。

以上、ご確認ください。


CC BY-SA 4.0
2018-06-08T14:20:38.580
44632
2018-06-08T15:07:19.297
2018-06-08T15:07:19.297
28832
28832
44624
answer