PHP
Как насчет использования Regex.IsMatch (string, int)
с использованием регулярного выражения, начинающегося с \ G
(что означает «начало последнего совпадения»)?
Кажется, работает:
using System;
using System.Text.RegularExpressions;
class Test
{
static void Main()
{
string text="one two 3 4 five";
Regex num=new Regex(@"\G[0-9]+");
Console.WriteLine("{0} {1}",
num.IsMatch(text, 8), // True
num.IsMatch(text, 0)); // False
}
}
Я не уверен, что полностью понимаю вопрос, но мне кажется, что вы можете просто сделать позицию частью регулярного выражения, например
^.{8}[\d]
, которая будет соответствовать, если есть 8 символы между началом строки и цифрой.
Если вам известна максимальная длина потенциального совпадения в строке, которую вы проверяете, ограничит сканирование строки.
Если вы проверяете только числа, это, вероятно, проще, чем если бы вы проверяли произвольные выражения. Природа Regex - сканировать до конца, чтобы найти совпадение. Если вы хотите предотвратить сканирование, вам необходимо указать длину или использовать что-то другое, кроме Regex.
string text = "one two 3 4 five";
Regex num = new Regex("[0-9]+");
int indexToCheck = 8;
int maxMatchLength = ...;
Match m = num.Match(text, indexToCheck, maxMatchLength);
Знаете ли вы что-нибудь о том, какие типы выражений могут выполняться для строк, и не вызовет ли сканирование всей строки слишком много накладных расходов?
num.Match вернет первое совпадение, если оно существует, а затем остановит сканирование. Если вам нужно больше совпадений, вы должны вызвать m.NextMatch (), чтобы продолжить сканирование совпадений.
Если вы хотите найти только подстроку текста, возьмите эту подстроку перед регулярным выражением.
myRegex.Match(myString.Substring(8, 10));