Ключ Havmap Javascript, скомпилированный в регулярное выражение - PullRequest
2 голосов
/ 19 ноября 2008

Регулярное выражение monthRegex всегда возвращает true, даже если dateInput что-то наподобие «1 декабря 2008», по моим мыслям, оно должно совпадать с регулярным выражением по любому ключу, который я передаю ему. Но это не то, что происходит, оно просто возвращает true и определяет «JAN» как месяц.

    function dateFormat(dateInput) {

    var formattedDate = "";

    var the_date, month, year;

    var monthHash = new Array();
    monthHash['JAN']="01";
    monthHash['FEB']="02";
    monthHash['MAR']="03";
    monthHash['APR']="04";
    monthHash['MAY']="05";
    monthHash['JUN']="06";
    monthHash['JUL']="07";
    monthHash['AUG']="08";
    monthHash['SEP']="09";
    monthHash['OCT']="10";
    monthHash['NOV']="11";
    monthHash['DEC']="12";

    // Find which month we are dealing with
    var whichKey = null;

    for(var key in monthHash) {


        var monthRegex = new RegExp(key, "i")
        monthRegex.compile();

        console.log("monthRegex.compile: " + monthRegex.test(dateInput));

        if(monthRegex.test(dateInput))
        {
            whichKey = key;
            break;
        }
    }
}

Спасибо,
Эндрю Дж. Лир

Ответы [ 3 ]

3 голосов
/ 19 ноября 2008

Первое замечание: не используйте массив как ассоциативный массив! Используйте объект вместо. Или используйте массив в обратном порядке.

Второе замечание: почему вы используете регулярные выражения для такого простого поиска? Вместо этого используйте indexOf:

function dateFormat(dateInput) 
{
  var formattedDate = "";

  var the_date, month, year;

  var months = new Array("", 
      "jan", "feb", "mar", 
      "apr", "may", "jun", 
      "jul", "aug", "sep", 
      "oct", "nov", "dec"
  );

  // Find which month we are dealing with
  for (var i = 1; i < months.length; i++) 
  {
    if (dateInput.toLowerCase().indexOf(months[i]) > -1)
    {
      var whichMonth = months[i];
      break;
    }
  }
  if (whichMonth != undefined)
    alert("Found: "  + whichMonth);
}
dateFormat("10 Jun 2008");

Если вы действительно хотите использовать регулярные выражения, чтобы остаться в теме, вот еще один способ:

function dateFormat(dateInput) 
{
  var formattedDate = "";

  var the_date, month, year;

  var months = /(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i;

  // Find which month we are dealing with
  var matches = dateInput.match(months);
  if (matches != null)
    alert("Found: "  + matches[1]);
}
dateFormat("December, 10 2008");
2 голосов
/ 19 ноября 2008

Удалите «monthRegex.compile ();» линия и все работает.

Это потому, что monthRegex.compile (); соответствует "" как регулярное выражение и, следовательно, все соответствует ему.

0 голосов
/ 19 ноября 2008

Вам не нужно использовать регулярные выражения для простого сопоставления старых строк. Особенно вам не нужно компилировать и выбрасывать 12 регулярных выражений каждый раз, когда вызывается функция.

Более разумная версия:

// Get integer number of named month. 1-indexed for January;
// return 0 if unreadable name.
//
function readMonth(s) {
    var begin= s.toLowerCase().substring(0, 3);
    var ix= MONTHS.indexOf(begin);
    if (ix==-1) return 0;
    return ix/4+1;
}
var MONTHS= 'jan feb mar apr may jun jul aug sep oct nov dec';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...