Как сопоставить регулярное выражение при индексе начала?

Как создать регулярное выражение, которое начнет поиск, где он начнет поиск?

Другими словами:

Что эквивалентно \A, который говорит: "совпадение в начале поиска, даже если оно не в начале основной строки"?

new Regex(@"\A\n").IsMatch("!\n", 1);    // Should be true, but is false

Ответ 1

То, что вы ищете, это \G:

new Regex(@"\G\n").IsMatch("!\n", 1);    // It twue, it twue!

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

EDIT:. Подумайте об этом, Java find(int) работает одинаково - я даже использовал его широко. Но затем они добавили API "регионов" в Java 5, который предлагает гораздо более тонкий контроль, и я забыл об этой идиоме. Я никогда не думал искать его в .NET.

Ответ 2

Оооо, я просто вспомнил кое-что, что я читал ~ 4-5 лет назад в книге, касающейся Regex.Match...

Перегрузки не ведут себя так, как мы их ожидаем!

Перегрузка

Regex.Match(string input, int index, int length)

указывает подстроку для поиска, тогда как перегрузка

Regex.Match(string input, int index)

просто диктует, где должен начинаться поиск!

(В одном случае он не работает, начиная с произвольной позиции в подстроке, я думаю.)

Надеюсь, это просвещает людей...