2013-04-23 167 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。