Как правильно разделить регулярные выражения на весь шаблон в положительном свете (знак вопроса равен) - PullRequest
1 голос
/ 03 февраля 2020

Я хотел бы разбить на все экземпляры тега <p>, за которым следует последовательность того же заглавного символа, за которым следует точка. Например, <p>A. и <p>BB. будут соответствовать, а <p>a., <p>AB., <p>Aa. и <p>C - нет. Это регулярное выражение, которое я имею (я использую. NET):

(?=<p>\s*([A-Z])\1*\.)

Проблема в том, что разделенный список

  1. A

  2. <p>A.

, когда оно должно быть только 1. <p>A. (я хочу, чтобы соответствующий шаблон был включен в разделенном списке, который является причиной положительного взгляда).

Я полагаю, это связано с круглыми скобками вокруг ([A-Z]), которые необходимы для создания группы захвата для сопоставления с одним и тем же символом, используя \1. Я использую http://regexstorm.net/tester, чтобы проверить это.

1 Ответ

1 голос
/ 04 февраля 2020

Вы можете использовать регулярное выражение для совпадения местоположений в строке и добавления подстрок из предыдущего найденного индекса:

var text = "<p>AI.For example <p>A.I<p>BB.";
var result = new List<string>();
var rx = new Regex(@"(?=<p>\s*([A-Z])\1*\.)");   // The zero-length matching regex used in Regex.Split
var idx = 0;
foreach (Match m in rx.Matches(text)) {           // Iterate over all matches
    result.Add(text.Substring(idx, m.Index-idx)); // Add item to resulting array
    idx = m.Index;
}
if (idx < text.Length - 1) {         // Add trailing text after last match if present
    result.Add(text.Substring(idx));
}

Вывод:

<p>AI.For example 
<p>A.I
<p>BB.

Или используйте регулярное выражение, которое вы использовали для восстановления Regex.Split в с редким символом , скажем \uFFFF недопустимый символ UTF8, а затем разделите его на этот символ:

var text = "aaa<p>AI.For example <p>A.I<p>BB.b";
text = Regex.Replace(text, @"(?=<p>\s*([A-Z])\1*\.)", "\uFFFF");
var result = text.Split('\uFFFF');
Console.WriteLine(string.Join("\n", result)); // => [aaa<p>AI.For example, <p>A.I, <p>BB.b]

См. C# демо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...