2013-04-23 117 views
0

我一直在努力制作一个正则表达式来提取下面的信息,分为3部分,“之间”。只有第一和第二序列(星期五和日期成功)。用正则表达式提取文本“,”

2013年4月26日星期五18:30

我希望有人有经验。

问候

+2

你到目前为止尝试过什么?而且,将字符串拆分为''',并且占据中间部分可能更容易。您使用哪种语言进行匹配? – Mathletics 2013-04-23 19:52:33

+0

我不得不同意在''上分割会比使用正则表达式更容易。如果您仅使用正则表达式来创建非确定性有限自动机,则这是不同的情况。 – 2013-04-23 20:02:57

回答

3

为什么不能简单地分割字符串和装饰的各个部分的多余空白?例如,冗长用C#编写:

string input = "Friday, 26 Apr 2013, 18:30"; 

string[] parts = input.Split(','); 

for (int i = 0; i < parts.Length; i++) 
{ 
    parts[i] = parts[i].Trim(); 
} 

Console.WriteLine(parts[0]); // "Friday" 
Console.WriteLine(parts[1]); // "26 Apr 2013" 
Console.WriteLine(parts[2]); // "18:30" 

如果你真的想用这个正则表达式,^(.*),(.*),(.*)$应该工作:

string input = "Friday, 26 Apr 2013, 18:30"; 

Regex regex = new Regex("^(.*),(.*),(.*)$", RegexOptions.Singleline); 
Match match = regex.Match(input); 

Console.WriteLine(match.Groups[1].Value.Trim()); // "Friday" 
Console.WriteLine(match.Groups[2].Value.Trim()); // "26 Apr 2013" 
Console.WriteLine(match.Groups[3].Value.Trim()); // "18:30" 

添加相应的错误检查就留给读者做练习。

1

下面的正则表达式表达式匹配这个整体的一部分:

, 18:30 
I hope someone has the experience. 
Best regards 

,+\s[0-9]+:[0-9]+ \r*.* 

但是,是的,那是一种超具体到本“小时:分钟再予[...]”格式。如果您使用PHP或您的语言中的等效语言,则应该进行拆分。

1

我想你真正想要的是这样的:

from datetime import datetime 
s="Friday, 26 Apr 2013, 18:30" 
d=datetime.strptime(s, "%A, %d %b %Y, %H:%M") 
d 

Out[7]: datetime.datetime(2013, 4, 26, 18, 30) 

strptimedate format文档的详细信息:)

编辑:对不起,我莫名其妙地被假设你使用Python。其他语言也有类似的习语,例如, PHP's date_parse,C#的DateTime.Parse

+1

C#有一个DateTime.ParseExact函数,它将解析出给定格式字符串的正确部分并构造一个有效的DateTime对象。 – 2013-04-23 20:07:23

+0

我一定在编辑你的评论时一直在编辑我的文章。很高兴看到我们得出同样的结论! :) – m01 2013-04-23 20:08:36

+0

我发布了一个关于如何解析C#中的本地化日期的答案。另外,当它应该是DateTime.ParseExact时,我错误地放了DateTime.Parse。 DateTime.Parse希望日期处于特定格式,否则将无法解析日期。 – 2013-04-23 20:17:30

0

您没有指定一种语言,所以我打算用标准的REGEX方法来回答这个问题。

(?<=(^|,\s+)).+?(?=(,|$))将为您工作。

让我分手它在做什么。

  • (?<=(^|,\s+) - 预先查看字符串或逗号后跟空格的开头,但不要将其包含在匹配中。所有比赛必须在他们面前。
  • .+? - 抓住所有角色,但不要贪婪。
  • (?=(,|$)) - 查看字符串或逗号的结尾。所有的比赛都必须有这个背后。

当上Friday, 26 Apr 2013, 18:30你的测试用例跑,我得到的3场比赛:

  • Friday
  • 26 Apr 2013
  • 18:30
0

像M01的答案,你可以试试这个方法与C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Globalization; 

namespace TestDate 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string dateString = "Friday, 26 Apr 2013, 18:30"; // Modified from MSDN 
      string format = "dddd, dd MMM yyyy, HH:mm"; 

      DateTime dateTime = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 
      Console.WriteLine(dateTime); 
      Console.Read(); 
     } 
    } 
} 

这将打印出在用户机器上配置的本地化日期和时间。对我来说,它打印出4/16/2013 6:30:00 PM。