2

任何人都可以建议一个正则表达式来测试字符串的第一个单词是否是一周中的一天。

例如“7 月 16 日,星期二”

到目前为止,我有这个:

/^((Monday)|(Tuesday)|(Wednesday)|(Thursday)|(Friday)|(Saturday)|(Sunday))/.test("Tuesday, July 16")

哪个有效,有没有办法可以进一步使用正则表达式将表达式分成日和月?

4

2 回答 2

4

尝试这个:

 /^(?i)\W*(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day\b[\s\S]*$/.test("Tuesday, July 16")
于 2013-07-09T17:07:13.667 回答
2

就个人而言,我想把它分成多个部分。. . 一种检查格式,另一种检查值中数据的有效性。

首先,使用基本的正则表达式检查格式:

var input = "Tuesday, July 16";
var pattern = new RegExp("^([a-z]+), ([a-z]+) (\\d{2})$", "i");
var isFormattedCorrectly = pattern.test(input);

然后,如果格式正确,我会将有效的日期和月份值存储在两个数组中,并检查日期片段是否与这些值之一匹配:

var validDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
var validMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

var isValidDay = false;
var isValidMonth = false;

if (isFormattedCorrectly ) {
    var dateParts = input.match(pattern);
    isValidDay = (validDays.indexOf(dateParts[1]) > 0) ? true : false;
    isValidMonth = (validMonths.indexOf(dateParts[2] > 0) ? true : false;
}

注意:如果您使用的是 JQuery,您也可以使用我们JQuery.inArray()来代替.indexOf().

虽然它可能不是“简短而甜蜜”,但我有几个理由建议这种方法:

  1. 正如我之前提到的,它允许您将格式设置和数据检查彼此分开,这通常被认为是一件好事。:)
  2. 它支持更详细的验证消息(例如,“日期必须格式化为...”、“您必须输入有效的月份”等),而不是单一的、通用的“这不是有效日期”消息.
  3. 希望它可以更轻松地维护“有效值”数据,因为它只是一个数组,而不是 regex 中内置的模式。. . 您可以随意更新值(例如,如果您想使用 3 个字符的月份和日期值而不是完整的单词)。
  4. 它允许轻松的语言定制(例如,如果您出于某种原因需要支持西班牙语,您可以将数组中的数据切换为西班牙语的日期和月份,并且检查仍然有效)。
于 2013-07-09T17:58:31.640 回答