Есть ли регулярное выражение, позволяющее мне посчитать количество повторений, соответствующих операторам * и +? - PullRequest
5 голосов
/ 12 июня 2010

Существует ли регулярное выражение, позволяющее мне подсчитывать количество повторений, сопоставленных с операторами * и +? Мне бы особенно хотелось узнать, возможно ли это на платформе .NET.

Ответы [ 3 ]

8 голосов
/ 12 июня 2010

Вам повезло, потому что на самом деле .NET regex делает это (что я считаю довольно уникальным). По сути, в каждом Match каждый Group хранит каждое Captures, которое было сделано.

Таким образом, вы можете посчитать, сколько раз повторяемый шаблон совпал с входом:

  • Создание группы захвата
  • Подсчет количества снимков, сделанных этой группой в каждом матче
    • Вы также можете перебирать отдельные записи, если хотите!

Вот пример:

Regex r = new Regex(@"\b(hu?a)+\b");

var text = "hahahaha that's funny but not huahuahua more like huahahahuaha";
foreach (Match m in r.Matches(text)) {
   Console.WriteLine(m + " " + m.Groups[1].Captures.Count);
}

Это печатает ( как видно на ideone.com ):

hahahaha 4
huahuahua 3
huahahahuaha 5

API ссылки

3 голосов
/ 12 июня 2010

Вы можете использовать скобки в выражении для создания группы, а затем использовать оператор + или * для группы.Свойство Captures Group можно использовать для определения того, сколько раз оно было сопоставлено.В следующем примере подсчитывается количество последовательных строчных букв в начале строки:

var regex = new Regex(@"^([a-z])+");
var match = regex.Match("abc def");

if (match.Success)
{
    Console.WriteLine(match.Groups[1].Captures.Count);
}
0 голосов
/ 12 июня 2010

как насчет взятия "pref ([a-z]+) suff"

, а затем использования групп для захвата этого [az] + в скобках и определения его длины?

Вы также можете использовать эту длину для последующего сопоставления.

...