1

最近、JS での正規表現による時刻形式の変換に関する質問を投稿しました。

今、私はコードを少し修正しました。

function getHours(value) {
  if (value == 0)
    return 0;
  var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
  var myArray = re.exec(value);
  var hours = 0;
  var minutes = 0;
  if (myArray != null) {
    if (myArray[2] != null) {
      hours = myArray[2];
    }
    if (myArray[5] != null) {
      minutes = myArray[5];
    }
  }
  return Number(hours) + Number(minutes) / 60;
}

null問題は、 で値を返すことですmyArray

私はJSが初めてなので、この問題を解決できませんでした。私は何を間違っていますか?

4

3 に答える 3

2

問題はここにあります

new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");

コンストラクターを使用して新しい正規表現を作成するときは、文字列を指定します。文字列リテラルでは、バックスラッシュ文字 ( \) は「次の文字をエスケープする」ことを意味します。

これらのバックスラッシュをエスケープする必要があるため、後続の文字がエスケープされません。したがって、正しいバージョンは次のとおりです。

new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");

JavaScript で文字をエスケープする方法の詳細については、MDN の値、変数、およびリテラルに関するこの記事を参照してください。

于 2013-04-26T10:36:10.657 に答える
1

問題は次の行にあります。

var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");

PlsRegExp classは、構築する引数として文字列を取ることを理解しており、エスケープを2\d回行い、正規表現\sエンジンによって正しく解釈される必要があるため、正規表現文字列で次のように\dなる必要が\\dあります。\s\\s

var re = new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");

次のこともできることに注意してください。

var re = /^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g;
于 2013-04-26T10:36:57.630 に答える