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

Мне нужно написать регулярное выражение, которое игнорирует определенную строку «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();
 }

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

попробуйте это @"^(?:YGXZYY\s+)?(.+)"

Hezy Ziv 05.09.2024 14:49

вопрос неясен. если бы вы просто хотели удалить YGXZYY в самом начале строки (за которой следует любое количество пробелов), этого было бы достаточно Regex.Replace(input, @"^YGXZYY\s*", ""); ... но неясно, что вы имели в виду, когда сказали, потому что выражение регулярного выражения на самом деле вводится из пользовательского интерфейса

Diego D 05.09.2024 15:07

Возможно, вот так (?<=^YGXZYY\s+)[a-zA-Z].* см. regex101.com/r/W4Soou/1 или (?<=^YGXZYY\s+)[a-zA-Z].*|^(?!YGXZYY\s)[a-zA-Z].* см. regex101.com/r/cHTmlt/1

The fourth bird 05.09.2024 15:10

@HezyZiv, спасибо, но это правило не работает, например input1.

Wei Tao 05.09.2024 16:15

Привет @DiegoD, чтобы внести ясность, я имею в виду, что код для тестирования, который я показываю выше, в котором логика сопоставления на самом деле взята из клиентского программного обеспечения, поэтому я не мог написать свой собственный код с помощью Regex.Replace или чего-то вроде matched.Groups[1 ].Ценить. Я мог предоставить только текст правила регулярного выражения.

Wei Tao 05.09.2024 16:25

@Thefourthbird, большое спасибо. Второе правило работает для всех примеров! Я проведу исследование по этому поводу.

Wei Tao 05.09.2024 16:30

@WeiTao Отлично, в этом случае вы можете принять опубликованный ответ Виктора.

The fourth bird 05.09.2024 16:43

При сопоставлении ^(?:YGXZYY *)?(.*) (который обязательно совпадает) интересующая вас подстрока будет содержаться в группе захвата 1. Демо. Регулярное выражение необязательно (?) соответствует 'YGXZYY' в начале строки, за которым следует ноль или более пробелов, это возможное совпадение, за которым следует оставшаяся часть строки, которая фиксируется в группе 1 ((.*)).

Cary Swoveland 06.09.2024 06:38

@WeiTao Если все ваши строки начинаются со словесного символа, вот такая идея: \b(?!^YGXZYY)\w.*

bobble bubble 06.09.2024 09:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 в начале строки.

Код C#, о котором я показываю, представляет собой базовую логику, которую я не могу изменить (я получаю этот логический код путем декомпиляции сборки и просто пишу пример для тестирования), что я мог бы сделать, это просто предоставить текст правила регулярного выражения во входных данных. контроль. Таким образом, метод доступа к группе захвата недоступен. ( ̄Д  ̄)

Wei Tao 05.09.2024 16:07

@WeiTao ОК, смотри обновление.

Wiktor Stribiżew 05.09.2024 16:14

Другие вопросы по теме

Регулярное выражение для повторяющихся последовательностей символов
Регулярное выражение ReactJS не работает с разделенной строкой
PowerShell Regex: удаление определенных частей строки на основе шаблонов
Удаление всех слов, кроме первой буквы, с помощью регулярного выражения в LibreOffice Writer
Почему некоторые функции регулярных выражений возвращают объект соответствия, а некоторые нет?
Регулярное выражение для проверки того, содержит ли ввод две заданные строки, а часть между ними не содержит ни одного элемента из набора указанных строк
Regex: сопоставить кратчайший шаблон между двумя возможными разделителями
Использованиеdependent_wider_regex для создания новой строки для каждого совпадения в R
Добавить новые строки перед выбранными символами дефиса
Написание Regex для обработки дополнительных символов с плавающей запятой в начале строки?