РЕДАКТИРОВАТЬ: , чтобы соответствовать вашим обновленным требованиям, вы должны использовать этот шаблон, который использует обходные пути, чтобы пропустить все группы STX, кроме последней, которая имеет ETX после него:
string pattern = @"(?<=\[STX])?.*\[STX]\s*(.+?)\s*\[ETX].*?";
Вот полный пример:
string input = @"[STX]some string 1[ETX]
sajksajsk [STX]some string 2 [ETX] saksla
[ETX] dksldkls [STX]some string 3 [ETX]ds ds
dksldkls [STX]some string 4.1[ETX]ds ds [STX] some string 4.2[ETX] jdskjd
[STX] djkdsj [STX]dskd1[ETX] dsnds[ETX]
[STX] djkdsj [STX]dskd1[ETX] ddd
kdsj [STX]dskd1[ETX] dsnds[ETX]
[STX] djk[STX]dsj [STX]dskd2[ETX] ddd";
string pattern = @"(?<=\[STX])?.*\[STX]\s*(.+?)\s*\[ETX].*?";
foreach(Match m in Regex.Matches(input, pattern))
{
// result will be in first group
Console.WriteLine(m.Groups[1].Value);
}
Я также добавил \s*
между группировкой, чтобы устранить лишние пробелы. При этом вам больше не нужно использовать Trim()
, как я предложил в моем предыдущем ответе ниже.
ПРЕДЫДУЩИЙ ОТВЕТ
Этот шаблон должен соответствовать: "\[STX](.+?)\[ETX]"
Обратите внимание, что открывающая скобка, [
, должна быть экранирована, чтобы ее нельзя было интерпретировать как класс символов в регулярном выражении. Закрывающую скобку ]
не нужно экранировать. (.+?)
является группой захвата (из-за круглых скобок) и соответствует по крайней мере одному символу без жадности (через ?
). Будучи не жадным, он предотвращает жадное сопоставление обработчиком регулярных выражений нескольких вхождений и содержимого до последнего вхождения «[ETX]». Удалите ?
, и вы поймете, что я имею в виду в вашем str4
примере. Поскольку в вашем последнем примере есть несколько вхождений, вы можете использовать метод Matches .
string[] inputs =
{
"[STX]some string 1[ETX]",
"sajksajsk [STX]some string 2 [ETX] saksla",
"[ETX] dksldkls [STX]some string 3 [ETX]ds ds",
"dksldkls [STX]some string 4.1[ETX]ds ds [STX] some string 4.2[ETX] jdskjd"
};
string pattern = @"\[STX](.+?)\[ETX]";
foreach (string input in inputs)
{
Console.WriteLine("Input: " + input);
foreach(Match m in Regex.Matches(input, pattern))
{
// result will be in first group
Console.WriteLine(m.Groups[1].Value);
}
Console.WriteLine();
}
Вы можете использовать Trim()
для обрезки лишних пробелов (m.Groups[1].Value.Trim()
). Это возможно сделать по шаблону, но усложняет его без необходимости. Используйте перегрузку, которая принимает RegexOptions.IgnoreCase
, если вам нужно игнорировать регистр текста "STX" и "ETX" (если они не всегда в верхнем регистре).