Для более общего регулярного выражения, другой вариант будет рекурсивно соответствовать жадный регулярное выражение по сравнению с предыдущим матчем, отбрасывая первые и последние символы в свою очередь, для того, чтобы вы соответствуете только подстроке предыдущего совпадения. После сопоставления Marketing and Cricket on the Internet
мы тестируем как arketing and Cricket on the Internet
, так и Marketing and Cricket on the Interne
для подматричек.
Это идет что-то вроде этого в C# ...
public static IEnumerable<Match> SubMatches(Regex r, string input)
{
var result = new List<Match>();
var matches = r.Matches(input);
foreach (Match m in matches)
{
result.Add(m);
if (m.Value.Length > 1)
{
string prefix = m.Value.Substring(0, m.Value.Length - 1);
result.AddRange(SubMatches(r, prefix));
string suffix = m.Value.Substring(1);
result.AddRange(SubMatches(r, suffix));
}
}
return result;
}
Эта версия, однако, в конечном итоге возвращаясь в тот же submatch несколько раз, например, он нашел бы Marmoset
дважды в Marketing and Marmosets on the Internet
, сначала как submatch от Marketing and Marmosets on the Internet
, затем в качестве отсылки Marmosets on the Internet
.
Ум, вам действительно нужны регулярные выражения? – Gumbo
LEPL, библиотека синтаксического анализа для Python, имеет регулярные выражения, которые «дают» все возможные совпадения. – delnan