Мне нужно написать регулярное выражение, которое игнорирует определенную строку «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
в самом начале строки (за которой следует любое количество пробелов), этого было бы достаточно Regex.Replace(input, @"^YGXZYY\s*", "");
... но неясно, что вы имели в виду, когда сказали, потому что выражение регулярного выражения на самом деле вводится из пользовательского интерфейса
Возможно, вот так (?<=^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
@HezyZiv, спасибо, но это правило не работает, например input1.
Привет @DiegoD, чтобы внести ясность, я имею в виду, что код для тестирования, который я показываю выше, в котором логика сопоставления на самом деле взята из клиентского программного обеспечения, поэтому я не мог написать свой собственный код с помощью Regex.Replace или чего-то вроде matched.Groups[1 ].Ценить. Я мог предоставить только текст правила регулярного выражения.
@Thefourthbird, большое спасибо. Второе правило работает для всех примеров! Я проведу исследование по этому поводу.
@WeiTao Отлично, в этом случае вы можете принять опубликованный ответ Виктора.
При сопоставлении ^(?:YGXZYY *)?(.*)
(который обязательно совпадает) интересующая вас подстрока будет содержаться в группе захвата 1. Демо. Регулярное выражение необязательно (?
) соответствует 'YGXZYY'
в начале строки, за которым следует ноль или более пробелов, это возможное совпадение, за которым следует оставшаяся часть строки, которая фиксируется в группе 1 ((.*)
).
@WeiTao Если все ваши строки начинаются со словесного символа, вот такая идея: \b(?!^YGXZYY)\w.*
Вы можете использовать
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#, о котором я показываю, представляет собой базовую логику, которую я не могу изменить (я получаю этот логический код путем декомпиляции сборки и просто пишу пример для тестирования), что я мог бы сделать, это просто предоставить текст правила регулярного выражения во входных данных. контроль. Таким образом, метод доступа к группе захвата недоступен. ( ̄Д  ̄)
@WeiTao ОК, смотри обновление.
попробуйте это @"^(?:YGXZYY\s+)?(.+)"