Мне нужно написать регулярное выражение, которое игнорирует определенную строку «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();
}
Я думаю, что для его решения следует сочетать условное выражение и анализировать особенности, Я прочитал много статей, но мне не удалось заставить это работать.
Вы можете использовать
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
в начале строки.