Как игнорировать определенный префикс в начале, если он выходит, и сопоставить остальные

Мне нужно написать регулярное выражение, которое игнорирует определенную строку «YGXZYY» в начале, если она присутствует, а затем сопоставляет все остальные, например:

  • Строка: "YGXZYY Чжан Сан Сан" возвращает совпавший результат: "Чжан Сан Сан"

  • строка: "чанг сан сан" вернуть совпавший результат: "чанг сан сан"

  • строка: "GXZYY Чжан Сан Сан" возвращает совпавший результат: "Чжан Сан Сан"

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

Таким образом, код логики сопоставления на C# будет следующим:

 public static void DebugPrefix()
 {
     string input1 = "YGXZYY zhang san san";  // should be: zhang san san
     string input2 = "chang san san";  // should be: chang san san
     string input3 = "GXZYY zhang san san";  // should be: GXZYY zhang san san        

     var samples = new List<string>
     {
         input1,
         input2,
         input3                             
     };

     string pattern = @"(?(^YGXZYY)(?<=^YGXZYY)[a-zA-Z\s]+|[a-zA-Z\s]+)";
     //pattern = @"(?<=^YGXZYY)[a-zA-Z\s]+|(?<!^YGXZYY)[a-zA-Z\s]+";
     pattern = @"(?<!YGXZYY)[a-zA-Z\s]+";           
     Regex regex = new Regex(pattern);

     for (int idx = 0; idx < samples.Count; idx++)
     {
         var input = samples[idx];
         var result = regex.Match(input);
         Console.WriteLine($"sample {idx + 1}, origin string:{input}, matched result:{result.Value}");
     }
     Console.WriteLine();
 }

Я думаю, что для его решения следует сочетать условное выражение и анализировать особенности, Я прочитал много статей, но мне не удалось заставить это работать.


1
50
1

Ответ:

Решено

Вы можете использовать

public static void DebugPrefix()
{
    string input1 = "YGXZYY zhang san san";  // should be: zhang san san
    string input2 = "chang san san";  // should be: chang san san
    string input3 = "GXZYY zhang san san";  // should be: GXZYY zhang san san        

    var samples = new List<string>
    {
        input1,
        input2,
        input3                             
    };

    string pattern = @"(?<=^YGXZYY\s+).+|^(?!YGXZYY\s).+";
    Regex regex = new Regex(pattern);

    for (int idx = 0; idx < samples.Count; idx++)
    {
        var input = samples[idx];
        var result = regex.Match(input)?.Groups[2].Value;
        Console.WriteLine($"sample {idx + 1}, origin string:{input.Value}, matched result:{result}");
    }
    Console.WriteLine();
}

Посмотрите демо-версию C#. Выход:

sample 1, origin string:YGXZYY zhang san san, matched result:zhang san san
sample 2, origin string:chang san san, matched result:chang san san
sample 3, origin string:GXZYY zhang san san, matched result:GXZYY zhang san san

Шаблон регулярного выражения (?<=^YGXZYY\s+).+|^(?!YGXZYY\s).+ соответствует

  • (?<=^YGXZYY\s+).+ - любой один или несколько символов, кроме символов LF, как можно больше, которым предшествует текст YGXZYY в начале строки.
  • |- или
  • ^(?!YGXZYY\s).+ — любой один или несколько символов, кроме как можно большего количества символов LF, которые не начинаются с текста YGXZYY в начале строки.