【问题标题】:JS: Regular expression for stringJS:字符串的正则表达式
【发布时间】:2015-08-11 06:13:35
【问题描述】:

我有 js 和一个不同的字符串,像这样:

Tue Aug 11 2015 between  4:00 PM and  5:00 PM

字词betweenand 未更改 但有时我可以得到这个字符串,单词之间有不同数量的空格

Tue Aug 11 2015 between   4:00 PM and   5:00 PM  (3 spaces)

Tue Aug 11 2015 between 4:00 PM and 5:00 PM (1 spaces)

是否可以为这个字符串创建一个正则表达式?

  string re1="((?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday|Tues|Thur|Thurs|Sun|Mon|Tue|Wed|Thu|Fri|Sat))";  // Day Of Week 1
  string re2="(\\s+)";  // White Space 1
  string re3="((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Sept|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?))"; // Month 1
  string re4="(\\s+)";  // White Space 2
  string re5="((?:(?:[0-2]?\\d{1})|(?:[3][01]{1})))(?![\\d])";  // Day 1
  string re6="(\\s+)";  // White Space 3
  string re7="((?:(?:[1]{1}\\d{1}\\d{1}\\d{1})|(?:[2]{1}\\d{3})))(?![\\d])";    // Year 1
  string re8="(\\s+)";  // White Space 4
  string re9="(\"between\")";   // Double Quote String 1
  string re10="(\\s+)"; // White Space 5
  string re11="((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\\s?(?:am|AM|pm|PM))?)"; // HourMinuteSec 1
  string re12="(\\s+)"; // White Space 6
  string re13="(\"and\")";  // Double Quote String 2
  string re14="(\\s+)"; // White Space 7
  string re15="((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\\s?(?:am|AM|pm|PM))?)"; // HourMinuteSec 2

如何简化这一行的正则表达式?

【问题讨论】:

  • 您可以使用\s+ 来表示一个或多个空白字符。
  • 问题是什么?你想提取/替换什么?
  • 一天,string re1 = "((?:Tues?|Thu(rs?)?|Sun|Mon|Wed|Fri|Sat))"; // Day Of Week 1
  • 你不需要不同的regex来匹配多个空格,re4 re6 re8 re10 re12 re14可以替换成re2
  • 在你使用过这些正则表达式的地方添加完整的代码,这样问题就清楚了

标签: javascript regex date


【解决方案1】:

这是我重复使用您的代码的尝试:

var re1="((?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday|Tues|Thur|Thurs|Sun|Mon|Tue|Wed|Thu|Fri|Sat))";  // Day Of Week 1
var re2="\\s+";  // White Space 1
var re3="((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Sept|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?))"; // Month 1
var re5="((?:(?:[0-2]?\\d)|(?:3[01])))(?!\\d)";  // Day 1
var re7="(\\b(?:1\\d{3}|2\\d{3})\\b)";    // Year 1
var re11="((?:[0-1][0-9]|2[0-3]|[0-9]):[0-5][0-9](?::[0-5][0-9])?(?:\\s*(?:am|AM|pm|PM))?)"; // HourMinuteSec 
var reDay = "\\b((?:0?\\d|[12]\\d|3[01]))\\b";

var s = "Tue Aug 11 2015 between  4:00 PM and  5:00 PM";
var rx = RegExp(re1 + re2 + re3 + re2 + reDay + re2 + re7 + re2 + "between" + re2 + re11 + re2 + "and" + re2 + re11, 'i');
if ((m = rx.exec(s)) !== null) {
  document.write("Day of week: " + m[1] + "<br/>");
  document.write("Month: " + m[2] + "<br/>");
  document.write("Day: " + m[3] + "<br/>");
  document.write("Year: " + m[4] + "<br/>");
  document.write("From: " + m[5] + "<br/>");
  document.write("Till: " + m[6]);
  
}

请注意,我没有捕获空格(删除括号),添加了一个 reDay 几天,它只使用 \b\d{1,2}\b 捕获两个数字作为一个完整的单词,并且我已经找出了一些正则表达式(删除了不必要的括号)并通过将\s? 更改为\s* 来修复时间正则表达式。看起来这是主要问题,因为? 代表0 或1 次出现,而* 表示0 次或多次出现

【讨论】:

  • 您还可以像一个月一样优化一天的正则表达式。使某些文本可选
  • @Tushar:你的意思是 精确 日正则表达式吗?喜欢var reDay = "\\b((?:0?\\d|[12]\\d|3[01]))\\b"?我更新了答案。
【解决方案2】:

试试这个:

string.replace(/\s+/g,' ').trim();

它会删除所有多余的空间,每次只保留 1 个空间。 所以如果你有 3 个空格,就像你说的那样,它会将它转换为 1 个空格

【讨论】:

  • 我怀疑空格修剪和缩小是 OP 需要的。
  • 这个问题没有说明OP需要什么,除了这个答案回答的部分:)。
  • @AdamMoszczyński 我改变了问题 - 没关系
猜你喜欢
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多