Match Диапазон чисел в Regex [duplicate]

В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время написания запросов.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

Теперь предположим, что вы используете прямую переменную post в MySQL-запросе, тогда используйте ее следующим образом:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

Это лучшая практика для использования переменных PHP в MySQL.

27
задан rudolph9 30 April 2014 в 16:45
поделиться

11 ответов

Проанализируйте проблему

Если вы «должны» использовать регулярное выражение, пропустите проблему, проанализировав принятые перестановки.

«диапазон от -2055 до 2055» может быть выраженный как:

  • необязательный -
  • необязательные начальные нули
  • , за которым следует число от 0 до 2055

«Число от 0 до 2055» может быть одним из конечного числа конкретных перестановок:

  • одна цифра (0-9)
  • две цифры (10- 99)
  • три цифры (100-999)
  • четыре цифры, начинающиеся с 1 (1000-1999)
  • четырехзначных цифр, начиная с 20 (2000-204 * 9)
  • четыре цифры, начинающиеся с 205 (2050-2055 *)

Обратите внимание, что для этого регулярного выражения нет необходимости различать диапазон " 0-9 "и" 1-9 ", и только последние два диапазона имеют какие-либо ограничения на диапазон принятых цифр / символов (обозначенных звездочкой).

Записывать выражения регулярных выражений

. Каждая из вышеуказанных составных частей легко индивидуально выразить как регулярное выражение:

  • -?
  • 0 * [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] 1 [0-9] [0-9] [0-9 ] 20 [0-4] [0-9] 205 [0-5]

Поместите выражения вместе

. Соответствующим выражением для всего совпадения будет:

-?0*([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|1[0-9][0-9][0-9]|20[0-4][0-9]|205[0-5])

Или немного более сжато:

-?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])

Предполагая , вход содержит только «число» и ничего больше, поэтому последнее регулярное выражение :

^-?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])$

Если необходимо разрешить знак ведущего плюса, это становится:

^[-+]?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])$

Вот сценарий js , демонстрирующий, что проходит и что не удастся последнему регулярному выражению.

5
ответ дан AD7six 25 August 2018 в 20:42
поделиться
13
ответ дан aliteralmind 25 August 2018 в 20:42
поделиться

Попробуйте с очень простым регулярным выражением.

^([-0][0-1][0-9][0-9][0-9])$|^([-0]20[0-4][0-9])$|^([-0]205[0-5])$

Визуальное представление

enter image description here [/g0]

Это очень просто понять.

  • группа 1 [-0][0-1][0-9][0-9][0-9] будет охватывать [-1999, 1999] значения
  • группа 2 [-0]20[0-4][0-9] будет охватывать [-2000, -2049] и [2000,2049] значения
  • группа 3 [-0]205[0-5] будут отображаться [-2050, -2055] и [2050, 2055] значения

String.format("%05d", number) делают очень хорошо

Пример кода: (Читайте встроенные комментарии для большей ясности.)

int[] numbers = new int[] { -10002, -3000, -2056, -2055, -2000, -1999, -20, 
                            -1,  0, 1, 260, 1999, 2000, 2046, 2055, 2056, 2955, 
                             3000, 10002, 123456 };

//valid range -2055 to 2055 inclusive

Pattern p = Pattern.compile("^([-0][0-1][0-9][0-9][0-9])$|^([-0]20[0-4][0-9])$|^([-0]205[0-5])$");

for (int number : numbers) {
    String string = String.format("%05d", number);
    Matcher m = p.matcher(string);

    if (m.find()) {
        System.out.println(number + " is in range.");
    } else {
        System.out.println(number + " is not in range.");
    }
}

output:

-10002 is not in range.
-3000 is not in range.
-2056 is not in range.
-2055 is in range.
-2000 is in range.
-1999 is in range.
-20 is in range.
-1 is in range.
0 is in range.
1 is in range.
260 is in range.
1999 is in range.
2000 is in range.
2046 is in range.
2055 is in range.
2056 is not in range.
2955 is not in range.
3000 is not in range.
10002 is not in range.
123456 is not in range.
1
ответ дан Braj 25 August 2018 в 20:42
поделиться

Использование регулярных выражений для проверки числового диапазона

Чтобы быть ясным: если достаточно простого оператора if

if(num < -2055  ||  num > 2055)  {
   throw  new IllegalArgumentException("num (" + num + ") must be between -2055 and 2055");
}

To ясно: если достаточно простого оператора if

, использование регулярных выражений для проверки числовых диапазонов не рекомендуется.

Кроме того, поскольку регулярные выражения анализируют строки, номера должны сначала переводиться в строку перед тем, как они могут быть протестированы. Исключением является то, что число уже является строкой, например, при получении пользовательского ввода с консоли.

(Чтобы гарантировать, что строка начинается с номера, вы можете использовать org.apache.commons.lang3.math.NumberUtils#isNumber(s))

Кроме того, поскольку регулярные выражения анализируют строки, номера сначала должны быть переведены в строку перед их тестированием. Исключение составляет то, что число уже является строкой, например, при получении пользовательского ввода с консоли.

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

(Ссылки в этом ответе взяты из Часто задаваемых вопросов регулярных выражений переполнения стека .)

A один диапазон номеров

(Чтобы гарантировать, что строка начинается с номера, вы можете использовать org.apache.commons.lang3.math.NumberUtils#isNumber(s))

\b15\b

Правило: Число должно быть точно 15.

Самый простой диапазон. Регулярное выражение соответствует

Границы слова необходимы, чтобы избежать соответствия 15 внутри 8215242.

\b(15|16)\b
\b1(5|6)\b
\b1[5-6]\b

Диапазон двух чисел

Правило: Число должно быть между 15 и 16. Вот три возможных регулярных выражения:

(Группы требуются для «или» -инга, но они могут быть не захватывающими : \b(?:15|16)\b)

\b(\d|1[0-2])\b

Диапазон номеров "зеркальный" вокруг нуля

\b(         //The beginning of a word (or number), followed by either
   \d       //   Any digit 0 through 9
|           //Or
   1[0-2]   //   A 1 followed by any digit between 0 and 2.
)\b         //The end of a word

Правило: Число должно быть между -12 и 12.

-?\b(\d|1[0-2])\b

Здесь является регулярным выражением для 0 через 12, только с положительным значением:

Свободно-разнесенный:

(?<!-)\b(\d|1[0-2])\b

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

(Предполагается, что перед тире не должно быть никаких недопустимых символов.)

Чтобы запретить отрицательные числа, отрицательный lookbehind необходимо:

Правило: Число должно быть между -12 и 12.

Выход из внешнего вида приведет к тому, что 11 в -11 будет соответствовать. (Первый пример в этом сообщении должен содержать это.)

Примечание: \d по сравнению с [0-9]

Вот регулярное выражение для 0 - 12, только для положительного:

(?<!-)\b([1-3]?\d{1,2}|400)\b

Чтобы быть совместимым со всеми ароматами регулярных выражений, все \d -s следует изменить на [0-9] . Например, .NET рассматривает не ASCII-номера, например, на разных языках, как законные значения для \d. За исключением последнего примера, для краткости он оставлен как \d.

   (?<!-)          //Something not preceded by a dash
   \b(             //Word-start, followed by either
      [1-3]?       //   No digit, or the digit 1, 2, or 3
         \d{1,2}   //   Followed by one or two digits (between 0 and 9)
   |               //Or
      400          //   The number 400
   )\b             //Word-end

Свободно-разнесенный:

\b(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255|256|257|258|259|260|261|262|263|264|265|266|267|268|269|270|271|272|273|274|275|276|277|278|279|280|281|282|283|284|285|286|287|288|289|290|291|292|293|294|295|296|297|298|299|300|301|302|303|304|305|306|307|308|309|310|311|312|313|314|315|316|317|318|319|320|321|322|323|324|325|326|327|328|329|330|331|332|333|334|335|336|337|338|339|340|341|342|343|344|345|346|347|348|349|350|351|352|353|354|355|356|357|358|359|360|361|362|363|364|365|366|367|368|369|370|371|372|373|374|375|376|377|378|379|380|381|382|383|384|385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400)\b

(С благодаря @TimPietzcker )

Три цифры, причем все, кроме первой цифры, равны нулю

работа как с отрицательной, так и с положительной так же просто, как добавление опциональной в начале:

Правило: Должно быть между 0 и 400.

(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?<!-)0+))\b

Возможное регулярное выражение:

Свободное разнесение:

Другая возможность, которая никогда не должна использоваться:

(             //Capture group for the entire number
   -?\b             //Optional dash, followed by a word (number) boundary
   (?:20            //Followed by "20", which is followed by one of 
         (?:5[0-5]        //50 through 55
           |                  //or
         [0-4][0-9])      //00 through 49
      |                                         //or
         1[0-9]{3}        //a one followed by any three digits
      |                                         //or
         [1-9][0-9]{0,2}  //1-9 followed by 0 through 2 of any digit
      |                                         //or
         (?<!-)0+         //one-or-more zeros *not* preceded by a dash
   )                 //end "or" non-capture group
)\b            //End number capture group, followed by a word-bound

Окончательный пример: четыре цифры, отраженные вокруг нуля, которые не заканчиваются нулями.

Правило: Должно быть между -2055 и 2055

Это из вопроса в stackoverflow.

(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1?[0-9]{1,3})\b)

Regex:

-?\b(20(5[0-5]|[0-4][0-9])|1?[0-9]{1,3})\b

Regular expression visualization [/g29]

  import  java.util.Scanner;
  import  java.util.regex.Matcher;
  import  java.util.regex.Pattern;
  import  org.apache.commons.lang.math.NumberUtils;
/**
  <P>Confirm a user-input number is a valid number by reading a string an testing it is numeric before converting it to an it--this loops until a valid number is provided.</P>

  <P>{@code java UserInputNumInRangeWRegex}</P>
 **/
public class UserInputNumInRangeWRegex  {
  public static final void main(String[] ignored)  {

     int num = -1;
     boolean isNum = false;

     int iRangeMax = 2055;

     //"": Dummy string, to reuse matcher
     Matcher mtchrNumNegThrPos = Pattern.compile("(-?\\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?<!-)0+))\\b").matcher("");

     do  {
        System.out.print("Enter a number between -" + iRangeMax + " and " + iRangeMax + ": ");
        String strInput = (new Scanner(System.in)).next();
        if(!NumberUtils.isNumber(strInput))  {
           System.out.println("Not a number. Try again.");
        }  else if(!mtchrNumNegThrPos.reset(strInput).matches())  {
           System.out.println("Not in range. Try again.");
        }  else  {
           //Safe to convert
           num = Integer.parseInt(strInput);
           isNum = true;
        }
     }  while(!isNum);

     System.out.println("Number: " + num);
  }

Debuggex Demo

Возможное регулярное выражение:

[C:\java_code\]java UserInputNumInRangeWRegex
Enter a number between -2055 and 2055: tuhet
Not a number. Try again.
Enter a number between -2055 and 2055: 283837483
Not in range. Try again.
Enter a number between -2055 and 2055: -200000
Not in range. Try again.
Enter a number between -2055 and 2055: -300
Number: -300

Свободно-разнесенный:

Свободный интервал:

(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?<!-)0+))\b

(Wi th благодаря PlasmaPower и Casimir et Hippolyte для помощи при отладке.)

Конечная нота

74
ответ дан Community 25 August 2018 в 20:42
поделиться
3
ответ дан Oscar Bralo 25 August 2018 в 20:42
поделиться
3
ответ дан PlasmaPower 25 August 2018 в 20:42
поделиться
5
ответ дан SebastianH 25 August 2018 в 20:42
поделиться
0
ответ дан SF Lee 25 August 2018 в 20:42
поделиться
0
ответ дан sln 25 August 2018 в 20:42
поделиться
3
ответ дан Wiktor Stribiżew 25 August 2018 в 20:42
поделиться
4
ответ дан zx81 25 August 2018 в 20:42
поделиться
Другие вопросы по тегам:

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