Как соответствовать числам между X и Y с regexp?

Хорошо, это немного грязно, сложно: удалите последний символ, чтобы переопределить клавишу ввода пользователя:



// ...
private int _petitionCharStep = 0;
private string _petition = "This is a dummy text";
public string PetitionInput { get; set; } = string.Empty;

void PetitionHandleKeyDown(UIKeyboardEventArgs arg) {
    if (_petitionCharStep >= _petition.Length  )
    {
        PetitionInput = _petition.Substring(0, _petition.Length-1 );
        _petitionCharStep--;
    }
}

void PetitionHandleKeyUp(UIKeyboardEventArgs arg) {
    if (_petitionCharStep < _petition.Length  )
    {
        PetitionInput += _petition[_petitionCharStep];
        _petitionCharStep++;
    }        
}

enter image description here

[ 112] Проверьте это на Blazorfiddle.

24
задан Tomalak 25 March 2009 в 12:36
поделиться

4 ответа

Согласно Генерируют Регулярное выражение для Соответствия Произвольному Числовому Диапазону, и после генерации такого regex для примера в Regex_For_Range:

\b0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])\b

добился бы цели.

Процесс был бы (все еще после что генератор Regex):

Во-первых, ворвитесь в диапазоны равной длины:

110 - 999
1000 - 2234

Во-вторых, ворвитесь в диапазоны, которые приводят к простому regexes:

110 - 199
200 - 999
1000 - 1999
2000 - 2199
2200 - 2229
2230 - 2234

Превратите каждый диапазон в regex:

1[1-9][0-9]
[2-9][0-9]{2}
1[0-9]{3}
2[01][0-9]{2}
22[0-2][0-9]
223[0-4]

Сверните смежные полномочия 10: 1 [1-9] [0-9] [2-9] [0-9] {2} 1 [0-9] {3} 2 [01] [0-9] {2} 22 [0-2] [0-9] 223 [0-4]

Объединение regexes выше урожаев:

0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])

Затем мы попытаемся факторизовать общие префиксы с помощью дерева:
Синтаксический анализ в дерево на основе regex префиксов:

. 1 [1-9] [0-9]
+ [0-9]{3}
+ [2-9] [0-9]{2}
+ 2 [01] [0-9]{2}
+ 2 [0-2] [0-9]
+ 3 [0-4]

Превращение дерева синтаксического анализа в regex уступает:

0*(1([1-9][0-9]|[0-9]{3})|[2-9][0-9]{2}|2([01][0-9]{2}|2([0-2][0-9]|3[0-4])))

Мы выбираем более короткий в качестве нашего результата.

\b0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])\b
45
ответ дан VonC 28 November 2019 в 22:26
поделиться

Это не вид вещи regexes Excel в. Вы, вероятно, найдете легче гарантировать, чтобы у Вас было правильное количество цифр /^([0-9]{3,4})$/ и затем сделайте дальнейшие проверки по сравнению с получением.

18
ответ дан Chas. Owens 28 November 2019 в 22:26
поделиться

В то время как Вы могли сделать это с некоторым абсурдным взглядом regex (как VonC ответил), regex действительно, как предполагается, не делает это.. Почему бы не задержать проверку числа на перенаправленный к сценарию?

Если бы номера 110-2234 переходят к script1, и 1-109 переходят к script2, было бы намного более просто направить все числа на a router сценарий, и имеет его перенаправление к корректному местоположению (через перенаправления HTTP)..

В .htaccess:

RewriteRule ^view/([0-9]+)/?$ router.php?page=$1 [L]

.. затем в router.php, что-то как:

<?PHP
if(
   int($_GET['page']) > 110 &&
   int($_GET['page']) < 2234
){
    header("Status: 301 Moved Permanently\nLocation: /script1");
}else{
    header("Status: 404 Not Found");
}
?>
4
ответ дан dbr 28 November 2019 в 22:26
поделиться

Это возможно хотя не симпатичный.

\b(?:[1][1][0-9]|1\d{3}|223[0-4]|2[0-1]\d\d|2[0-2][0-3][0-4])\b

Я послал по электронной почте Phillip Hazel, автору PCRE, в 2006 что он думал о математике в regex:

Возможно, это находится из объема проекта в Вашем представлении: способность рассматривать числа, как являющиеся числами и не текстом, это определенно было бы стоящей функцией. Позволяя Вам сделать некоторая основная математика проверяет подобранные цифры, как: 2-я подобранная цифра выше или ниже, третья цифра несколько от 1-х, и намного более сложных случаев, которые я не уточню только для понимания моей мысли через. Вы чувствуете, что это превышает область textmatching?

на который я получил следующий ответ:

Да, я думаю, что делаю, и также, это не что-то, что доступно в регулярных выражениях Perl. Я знаю, что PCRE действительно имеет некоторые расширения от Perl, но ничто столь же главное как тот (Вы могли, возможно, взломать что-то использование выносок, но это будет немного специально, и несомненно чрезвычайно грязно!).

Philip

и я не мог согласиться больше теперь в '09. Просто соответствуйте всем числам и действительно пронумеруйте проверку на любом языке, которому Вы делаете соответствие.

3
ответ дан Svante 28 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: