Есть ли функция, которая возвращает индекс, с которого начинается соответствие RegEx? - PullRequest
27 голосов
/ 05 декабря 2009

У меня есть строки длиной 15 символов. Я выполняю некоторые сопоставления с шаблоном с помощью регулярного выражения. Я хочу знать позицию подстроки, где функция IsMatch() возвращает true.

Вопрос: Существует ли какая-либо функция, которая возвращает индекс совпадения?

Ответы [ 6 ]

40 голосов
/ 05 декабря 2009

Для нескольких матчей вы можете использовать код, подобный следующему:

Regex rx = new Regex("as");
            foreach (Match match in rx.Matches("as as as as"))
            {
                int i = match.Index;
            }
11 голосов
/ 05 декабря 2009

Использовать Match вместо IsMatch:

    Match match = Regex.Match("abcde", "c");
    if (match.Success)
    {
        int index = match.Index;
        Console.WriteLine("Index of match: " + index);
    }

Выход:

Index of match: 2
10 голосов
/ 05 декабря 2009

Вместо использования IsMatch используйте метод Matches . Это вернет MatchCollection , который содержит количество Match объектов. У них есть свойство Индекс .

4 голосов
/ 05 декабря 2009
Regex.Match("abcd", "c").Index

2

Примечание # Следует проверить результат Match.success, так как он возвращает 0 и может перепутать с позицией 0, пожалуйста, обратитесь к ответу Mark Byers. Благодаря.

2 голосов
/ 05 декабря 2009

Вместо использования IsMatch() используйте Matches:

        const string stringToTest = "abcedfghijklghmnopqghrstuvwxyz";
        const string patternToMatch = "gh*";

        Regex regex = new Regex(patternToMatch, RegexOptions.Compiled);

        MatchCollection matches = regex.Matches(stringToTest); 

        foreach (Match match in matches )
        {
            Console.WriteLine(match.Index);
        }
0 голосов
/ 05 декабря 2009
Console.Writeline("Random String".IndexOf("om"));

Это выдаст 4

a -1 означает отсутствие совпадения

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