Loading...
simeon_petrov avatar simeon_petrov 45 Точки

Как regex да ми намери всички повторения на даден стринг в целия техт?

Как при търсене на "аа" в "аааааа" да намеря 5 повторения, а не 3?

Този код дава отговор: 3 намерени повторения.

            string inputString = Console.ReadLine();
            string searchedWord = Console.ReadLine();
            var regex = new Regex(searchedWord,RegexOptions.IgnoreCase);
            var matches = regex.Matches(inputString);
            int count = 0;
            foreach (Match m in matches)
            {
                count++;
            }
            Console.WriteLine(  count);

 

Как се задава това, което в http://regexr.com/ се нарича: "expression flag" в C#? Например, как да задам търсене с флаг global?

Тагове:
0
C# Advanced 17/02/2016 23:22:16
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

regex.Matches е метод, който има implicitly зададен global флаг.

regex.Match е само за 1 съвпадение.

Малко търсене в интернет търсачка със стринга "C# regex overlap" ме доведе до едно решение:

string inputString = Console.ReadLine();
string searchedWord = Console.ReadLine();
string regexString = string.Format("(?={0})", searchedWord);
var regex = new Regex(regexString, RegexOptions.IgnoreCase);
var matches = regex.Matches(inputString);
Console.WriteLine(matches.Count);

PS: Вместо да въртиш цикъл, за да намериш стойност, която вече е намерена, можеш да ползваш Count пропъртито на резултатът, който се връща от метода Matches. Това е колекция, която пази своята дължина в пропърти.

2
17/02/2016 23:49:33
a_rusenov avatar a_rusenov 1103 Точки

С positive lookahead можеш да кажеш "мачни ми всяко a, след което има друго а".

a(?=a)

По твоя начин то мачва първите 2 а и продължава нататък. Т.е. при нещо вече мачнато няма как да се върнеш назад.

Относно глобалния флаг - .Matches() си прави глобално претърсване по подразбиране, не е нужно да го сетваш никъде.

7
simeon_petrov avatar simeon_petrov 45 Точки

Благодаря за отговорите! Бяха много полезни!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.