Проблема со строкой, совпадающей с шаблоном Regex, и заменой на совпадающую - PullRequest
1 голос
/ 31 марта 2020

Требуется, чтобы строковая переменная text2, содержащая данные таблицы в формате dd/mm/yyyy hh:mm, нуждалась в замене даты и времени, заключенных в двойные кавычки, на ="dd-MMM-yyyy HH:mm:ss"

Например: 25-Feb-2020 15:27:58 необходимо заменить на ="25-Feb-2020 15:27:58"

DotNetFiddler

Вот полный фрагмент кода, показанный ниже

using System;
using System.Text.RegularExpressions;


public class Program
{
    public static void Main()
    {
        string text = "<table>\n  <thead><tr><th style=\"\"><div class=\"th-inner \">Login Name</div><div class=\"fht-cell\"></div></th><th style=\"\"><div class=\"th-inner sortable\">Registered</div><div class=\"fht-cell\"></div></th><th style=\"\"><div class=\"th-inner \">Registered Date <br>Time</div><div class=\"fht-cell\"></div></th><th style=\"\"><div class=\"th-inner sortable\">User Response Count</div><div class=\"fht-cell\"></div></th><th style=\"\"><div class=\"th-inner \">Test Start Date Time</div><div class=\"fht-cell\"></div></th><th style=\"\"><div class=\"th-inner \">Test End Date Time</div><div class=\"fht-cell\"></div></th><th style=\"\"><div class=\"th-inner \">Time Remaining</div><div class=\"fht-cell\"></div></th><th style=\"\"><div class=\"th-inner \">User Status</div><div class=\"fht-cell\"></div></th></tr></thead><tbody><tr data-index=\"9\"><td style=\"\">njuser14</td><td style=\"\">Yes</td><td style=\"\">-</td><td style=\"\">0</td><td style=\"\">29-Feb-2020 15:27:58</td><td style=\"\">29-Feb-2020 15:28:03</td><td style=\"\">179</td><td style=\"\">Paused</td></tr><tr data-index=\"10\"><td style=\"\">njuser15</td><td style=\"\">Yes</td><td style=\"\">-</td><td style=\"\">0</td><td style=\"\">29-Feb-2020 15:27:32</td><td style=\"\">29-Feb-2020 15:27:42</td><td style=\"\">179</td><td style=\"\">Paused</td></tr></tbody></table>";
        string text2 = " dasd arew 2017-03-11 12:25:56 2017-03-11 12:25:56 das tfgwe 2017-03-11 12:25:56 ";
        string pattern = @"\d{4}\-\d{2}\-\d{2}\s\d{2}\:\d{2}\:\d{2}";
        Regex r = new Regex(pattern);
        var res = r.Replace(text, new MatchEvaluator(ConvertDateFormat));
        var res2 = r.Replace(text2, new MatchEvaluator(ConvertDateFormat));
        Console.WriteLine(res);
        Console.WriteLine("-------------------------------------------------------");
        Console.WriteLine(res2);
    }

    static string ConvertDateFormat(Match m)
    {
        var mydate = DateTime.Parse(m.Value);
        return mydate.ToString("=yyyy-MM-dd hh:mm:ss");
    }
}

// 29-Feb-2020 15:27:58 need to be replaced with ="29-Feb-2020 15:27:58"

Результаты:

<table>
  <thead><tr><th style=""><div class="th-inner ">Login Name</div><div class="fht-cell"></div></th><th style=""><div class="th-inner sortable">Registered</div><div class="fht-cell"></div></th><th style=""><div class="th-inner ">Registered Date <br>Time</div><div class="fht-cell"></div></th><th style=""><div class="th-inner sortable">User Response Count</div><div class="fht-cell"></div></th><th style=""><div class="th-inner ">Test Start Date Time</div><div class="fht-cell"></div></th><th style=""><div class="th-inner ">Test End Date Time</div><div class="fht-cell"></div></th><th style=""><div class="th-inner ">Time Remaining</div><div class="fht-cell"></div></th><th style=""><div class="th-inner ">User Status</div><div class="fht-cell"></div></th></tr></thead><tbody><tr data-index="9"><td style="">njuser14</td><td style="">Yes</td><td style="">-</td><td style="">0</td><td style="">29-Feb-2020 15:27:58</td><td style="">29-Feb-2020 15:28:03</td><td style="">179</td><td style="">Paused</td></tr><tr data-index="10"><td style="">njuser15</td><td style="">Yes</td><td style="">-</td><td style="">0</td><td style="">29-Feb-2020 15:27:32</td><td style="">29-Feb-2020 15:27:42</td><td style="">179</td><td style="">Paused</td></tr></tbody></table>
-------------------------------------------------------
 dasd arew =2017-03-11 12:25:56 =2017-03-11 12:25:56 das tfgwe =2017-03-11 12:25:56

Но здесь строковая переменная

  1. text2 значение заменяется на =dd-MMM-yyyy HH:mm:ss. Но не до "=dd-MMM-yyyy HH:mm:ss"
  2. text значение остается неизменным. Но не до "=dd-MMM-yyyy HH:mm:ss"

1 Ответ

1 голос
/ 31 марта 2020

Согласно комментариям, первая проблема, кажется, ожидание, что

return mydate.ToString("=yyyy-MM-dd hh:mm:ss");

будет включать кавычки, когда он преобразует формат DataTime в строку. Но эти кавычки на самом деле являются терминаторами самой строки формата и не являются частью строки формата.

Решение этой проблемы - то, что предложено Джастином

string.Format("=\"{0}\"", mydate.ToString("yyyy-MM-dd hh:mm:ss"))

Хотя я предпочел формат будет использовать строковую интерполяцию

$"\"{mydate.ToString("yyyy-MM-dd hh:mm:ss")}\""

Вторая проблема заключается в том, что text и text2 имеют разные форматы даты и времени, а предоставленное регулярное выражение соответствует только форматам в text2

text:  29-Feb-2020 15:27:58 
text2: 2017-03-11 12:25:56 
regex: @"\d{4}\-\d{2}\-\d{2}\s\d{2}\:\d{2}\:\d{2}"

Регулярные выражения соответствуют строкам и не знают о данных, которые они соответствуют. Таким образом, наивным регулярным выражением для текста будет что-то вроде (не проверено)

@"\d{2}\-[a-zA-Z]{3}\-\d{4}\s\d{2}\:\d{2}\:\d{2}"

Это предполагает, что месяцы всегда имеют длину 3 символа, и что нет ничего, что выглядит как дата, которая не является датой.

Ваш пример явно делает 2 разных совпадения, поэтому, если вы так поступаете, вы можете создать новое регулярное выражение для каждого из текста и текста2 и выполнить несколько замен. Или вы можете попробовать объединить регулярные выражения, такие как (непроверенные):

@"\d{4}\-\d{2}\-\d{2}\s\d{2}\:\d{2}\:\d{2}|\d{2}\-[a-zA-Z]{3}\-\d{4}\s\d{2}\:\d{2}\:\d{2}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...