2014-04-02 7 views
0

У меня есть строка, содержащая буквы и цифры. Эта строка также содержит дату, которую я хочу извлечь.C# Как искать определенный шаблон в строке?

пример: anv749dld95hd01/01/2012ncjf739dkcju

Я хочу, чтобы получить новую строку, которая будет содержать: 01/01/2012

Единственное, что я думал, чтобы разбить его с помощью: str.Split('/') таким образом я получить массив и работать по каждому cell - возьмите два последних символа первой ячейки, получите значение второго cel и затем получите первые 4 символа из третьей ячейки.

Есть ли лучший способ сделать это?

+4

Да, вы можете использовать Regex –

+0

1) Может ли эта строка содержать символы юникода? 2) Всегда ли формат dd/mm/yyyy или он зависит от языка? – CodesInChaos

ответ

5

Ну вы могли бы потенциально использовать регулярное выражение:

using System; 
using System.Text.RegularExpressions; 

class Test 
{  
    static void Main() 
    { 
     var input = "anv749dld95hd01/01/2012ncjf739dkcju"; 
     var regex = new Regex(@"\d{2}/\d{2}/\d{4}"); 
     var match = regex.Match(input); 
     if (match.Success) 
     { 
      Console.WriteLine("Got match: {0}", match.Value); 
     } 
     else 
     { 
      Console.WriteLine("No match found"); 
     } 
    } 
} 

(Вы могли бы назвать Match.NextMatch, чтобы проверить, что есть только один матч.)

Чтобы разобрать это как DateTime, вы бы затем используйте примерно следующее:

string dateText = match.Value; 
DateTime date; 
if (DateTime.TryParseExact(dateText, "dd/MM/yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.None, out date)) 
{ 
    // Use date 
} 
else 
{ 
    // Couldn't parse the value 
} 

(Мы не можем сказать, должно ли оно быть dd/MM/yyyy или MM/dd/yyyy; отрегулируйте по мере необходимости.)

Вы также можете дополнительно подтянуть регулярное выражение, если хотите, так что первая цифра месяца должна быть 0 или 1, а первая цифра дня должна быть 0, 1 или 2. На самом деле это зависит от ваших данных.

+0

на основе примера \ d {2}/\ d {2}/\ d {4} –

+0

@ArsenMkrt: Да, да, исправлено. –

+0

Стоит отметить, что это для вещей, которые * выглядят * как даты, OP должен TryParseExact совпадений для проверки. –

0

Используйте RegEx, чтобы найти шаблон и вернуть нужную строку.

2

Вы можете использовать Substring, вы можете найти первую косую черту и начать подстроку двух символов до и принять десять символов.

string date = str.Substring(s.IndexOf('/')-2, 10); 

Вы можете Разбираете подстроку с помощью DateTime.TryParseExact вы должны убедиться, если вы получили правильную подстроку.

bool isParsed = DateTime.TryParseExact(date, "dd/MM/YYYY", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out x1); 
+1

Что делать, если строка не содержит шаблона? –

+0

Шаблон даже требуется для регулярного выражения, не так ли? – Adil

+0

вы можете проверить, существует ли совпадение и успех шаблона по совпадению.Success –

Смежные вопросы