Как конвертировать IP-адрес в регулярное выражение в сценарии оболочки? [Дубликат]

Вам нужно использовать скобки, если имена свойств имеют специальные символы:

var foo = {
    "Hello, world!": true,
}
foo["Hello, world!"] = false;

Кроме этого, я полагаю, это просто вопрос вкуса. IMHO, точечное обозначение короче и делает более очевидным, что это свойство, а не элемент массива (хотя, конечно, JavaScript не имеет ассоциативных массивов).

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

5 ответов

Согласно Создайте регулярное выражение для соответствия произвольному числовому диапазону и после создания такого регулярного выражения для вашего примера в 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

выполнит трюк.

Процесс будет (по-прежнему после этого генератора регулярных выражений):

Сначала перейдите в равные диапазоны длин:

110 - 999
1000 - 2234

Во-вторых, перейдите в диапазоны, которые дают простые регулярные выражения:

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

Поверните каждый диапазон в регулярное выражение:

< / blockquote>
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]

Объединение приведенных выше выражений дает:

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])

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

. 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]

Поворот дерево разбора в выражение регулярных выражений:

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])))

Мы выбираем более короткий, чем наш re sult.

\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 26 August 2018 в 11:51
поделиться
  • 1
    C # / VB.NET / PHP или любой другой язык, кроме того, который я не знаю, будет замечательным. ;) – Echilon 22 January 2011 в 12:09
  • 2
    +1 для обоих впечатляющих и немного страшных. – joshin4colours 25 May 2012 в 15:11
  • 3
    кстати, это будет соответствовать 000, 001, 010 и т. д. – insaner 15 September 2014 в 10:48
  • 4
    не редактировал выше вовремя, я хотел сказать, что действительные числа заполнены ведущими 0: 0110, 00110, 000110 ... – insaner 15 September 2014 в 11:04
  • 5
    учетные данные запроса ссылки для просмотра – Doberon 25 May 2017 в 19:38

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

17
ответ дан Chas. Owens 26 August 2018 в 11:51
поделиться

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

Если числа 110-2234 перейти к сценарию1 и 1-109 перейти к скрипту2, было бы much проще направить все числа по сценарию 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 26 August 2018 в 11:51
поделиться
  • 1
    Я знаю это. Я хотел бы сделать это в .htaccess и избежать загрузки php и просто загрузить правильный статический файл :-) – barredo 31 March 2009 в 09:19
  • 2
    Но спасибо за ответ !! :-) – barredo 31 March 2009 в 09:20

Вы можете поместить регулярные выражения для следующих диапазонов вместе:

1[1-9]\d  = 110-199
[2-9]\d\d = 200-999
1\d\d\d   = 1000-1999
2[0-1]\d\d= 2000-2199
22[0-2]\d = 2200-2229
223[0-4]  = 2230-2234

для формирования:

(1[1-9]\d|[2-9]\d\d|1\d\d\d|2[0-1]\d\d|22[0-2]\d|223[0-4])

\ d означает [0-9], но в трех меньших символах

3
ответ дан insaner 26 August 2018 в 11:51
поделиться

Возможно, все не очень красиво.

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

Я отправил по электронной почте Филлипу Хейзелю, автору PCRE, в 2006 году, что он думал о математике в регулярном выражении:

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

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

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

Philip

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

3
ответ дан Svante 26 August 2018 в 11:51
поделиться
  • 1
    Я не хотел исправлять орфографию цитаты, но я не хочу, чтобы неправильные написание мемов распространялись. – Svante 24 March 2009 в 13:51
  • 2
    Это не соответствует номерам в диапазоне 120-199 – insaner 15 September 2014 в 10:58
Другие вопросы по тегам:

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