Как Regex.IsMatch по указанному смещению в .NET? - PullRequest
2 голосов
/ 17 апреля 2010

Предположим, что я хочу сопоставить "abc" в строке s, только если это происходит именно с индексом n.

int n = 2;
Console.WriteLine(new Regex("abc").IsMatch("01abc", n)); // true
Console.WriteLine(new Regex("abc").IsMatch("0123abc", n)); // true (but want false)
Console.WriteLine(new Regex("^abc").IsMatch("01abc", n)); // false (but want true)

Кажется, что единственный способ достичь этого без использования подстроки на входе - это что-то вроде этого:

var match = new Regex("abc").Match("0123abc", n);
Console.WriteLine(match.Success && match.Index == n);

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

Я пропустил явную перегрузку или настройку, которая ограничивала бы соответствие только предоставленным смещением?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2010

Использование \G:

var match = new Regex(@"\Gabc").Match("0123abc", n);

С Документы :

Если вы хотите ограничить совпадение так, чтобы оно начиналось с определенной позиции символа в строке, а механизм регулярных выражений не сканировал остаток строки на совпадение, закрепите регулярное выражение с помощью \G .. Это ограничивает совпадение, поэтому оно должно начинаться точно с startat.

0 голосов
/ 17 апреля 2010

Вы можете использовать \G в начале вашего регулярного выражения, чтобы оно совпадало в начале.

(^ не работает).

Тестирование в PowerShell:

PS> $r = [regex]"\Gabc"
PS> $r.IsMatch("01abc",2)
True
PS> $r.IsMatch("012abc",2)
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...