Механизм регулярных выражений вернет первую подстроку, удовлетворяющую шаблону. Если вы напишете (dog|dog has)
, он никогда не сможет соответствовать dog has
, потому что dog has
начинается с dog
, что является первой альтернативой. Кроме того, механизм регулярных выражений не будет возвращать совпадающие совпадения.
Вот запутанным метод:
var patterns = new[] { "dog", "dog has" };
var sb = new StringBuilder();
for (var i = 0; i < patterns.Length; i++)
sb.Append(@"(?=(?<p").Append(i).Append(">").Append(patterns[i]).Append("))?");
var regex = new Regex(sb.ToString(), RegexOptions.Compiled);
Console.WriteLine("Pattern: {0}", regex);
var input = "a dog has been seen with another dog";
Console.WriteLine("Input: {0}", input);
foreach (var match in regex.Matches(input).Cast<Match>())
{
for (var i = 0; i < patterns.Length; i++)
{
var group = match.Groups["p" + i];
if (!group.Success)
continue;
Console.WriteLine("Matched pattern #{0}: '{1}' at index {2}", i, group.Value, group.Index);
}
}
Это производит следующий вывод:
Pattern: (?=(?<p0>dog))?(?=(?<p1>dog has))?
Input: a dog has been seen with another dog
Matched pattern #0: 'dog' at index 2
Matched pattern #1: 'dog has' at index 2
Matched pattern #0: 'dog' at index 33
Да, это злоупотребление регулярных выражений :)
Это работает путем создания шаблон с использованием дополнительных lookaheads, которые фиксируют подстроки как побочный эффект, но шаблон в противном случае всегда соответствует пустой строке. Итак, есть n+1
совпадений, n
- длина ввода. Шаблоны не могут содержать пронумерованные обратные ссылки, но вместо этого вы можете использовать именованные обратные ссылки.
Кроме того, это может возвращать совпадающие совпадения, поскольку оно будет пытаться сопоставить все шаблоны во всех строковых позициях.
Но вы определенно должны сравнить это с ручным подходом (зацикливание на шаблоны и сопоставление каждого из них отдельно). Я не ожидаю, что это будет быстро ...
Правда, но на основании вышеприведенного примера можно было предположить что если собака соответствует, то собака также соответствует как автоматическое логическое предположение. –
@ Риос, да, ты прав. Я неправильно понял проблему. Я обновил ответ. –
Ничего себе, это одно из решений ... Удивительно! Благодарю. – ml123