Javascript Regex помощь для начинающих - PullRequest
1 голос
/ 05 августа 2009

Мне нужно проверить приведенный ниже диапазон с помощью регулярных выражений в JavaScript.

-20,00 до +20,00 с шагом 0,5.

Пользователь должен иметь возможность ввести 1,50 вместо +01,50.

Я пытался сделать много исследований в Google, хотя регулярное выражение не так просто. Если я правильно понимаю, мне нужно будет разделить регулярное выражение на более мелкие группы. С точки зрения программистов, я бы подумал, что мне нужно проверять каждый «символ», который был введен в поле ввода. Если я понимаю, как группировка работает в регулярных выражениях, то я думаю, что я мог бы сделать регулярное выражение самостоятельно. Поэтому, пожалуйста, помогите мне понять регулярное выражение с вышеупомянутой проблемой, не просто добавьте регулярное выражение в :)

Спасибо,

Ответы [ 7 ]

4 голосов
/ 05 августа 2009

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

Попытка:

function checkRange(input) {
    var value = parseFloat(input);
    return (!isNaN(value) && (value >= -20) && (value <= 20) && (value % 0.5 == 0));
}
1 голос
/ 05 августа 2009

Следующие должны это сделать

var myregexp = /^[+-]?(20\.00|[01?][0-9]\.[05]0)$/m;
if (subject.match(myregexp)) {
    // Successful match
} else {
    // Match attempt failed
}

// ^[+-]?(20\.00|[01?][0-9]\.[05]0)$
// 
// Options: ^ and $ match at line breaks
// 
// Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
// Match a single character present in the list below «[+-]?»
//    Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
//    The character “+” «+»
//    The character “-” «-»
// Match the regular expression below and capture its match into backreference number 1 «(20\.00|[01?][0-9]\.[05]0)»
//    Match either the regular expression below (attempting the next alternative only if this one fails) «20\.00»
//       Match the characters “20” literally «20»
//       Match the character “.” literally «\.»
//       Match the characters “00” literally «00»
//    Or match regular expression number 2 below (the entire group fails if this one fails to match) «[01?][0-9]\.[05]0»
//       Match a single character present in the list “01?” «[01?]»
//       Match a single character in the range between “0” and “9” «[0-9]»
//       Match the character “.” literally «\.»
//       Match a single character present in the list “05” «[05]»
//       Match the character “0” literally «0»
// Assert position at the end of a line (at the end of the string or before a line break character) «$»
0 голосов
/ 05 августа 2009

Должно работать следующее регулярное выражение:

^[+-]?(?:20\.?0{0,2}?|[01]?[0-9]\.?[05]?0?)$

Пояснение:

^                             # anchor the match at the start of the string
   [+-]?                      # optional sign
   (?:                        # non-capturing group for alternation:
      20\.?0{0,2}?            # match either 20 (optionally followed by . or .0 or .00)
   |                          # or
      [01]?[0-9]\.?[05]?0?    # match 00-19 (optionally followed by . or .0 or .5 or .50 or .00)
   )                          # end of alternation
$                             # anchor the match at the end of the string
0 голосов
/ 05 августа 2009

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

var value = ... // eg. "-20.05"
var number = parseFloat(value);
if (number >= -20 && number <= 20 && /[+-]?\d+\.[05]0/.test(value)) {
   alert("in range")
} else {
   alert("out of range")
}
0 голосов
/ 05 августа 2009

Это должно быть сделано в два этапа. Первым шагом является использование регулярного выражения, чтобы убедиться, что введенное значение является текстуально допустимым (т. Е. Оно имеет x количество десятичных чисел, имеет знак и т. Д.). Затем преобразуйте его в значение, чтобы убедиться, что оно логически действителен.

Итак, во-первых, вам может понадобиться регулярное выражение, подобное этому:

/^[+-]?\d{1,2}\.(00|50)$/

Это будет:

  • Убедитесь, что строка (необязательно) начинается с + или -.
  • За которыми следуют одно или два числа.
  • сопровождается точкой.
  • Вслед за 00 или 50

После этого вы можете убедиться, что оно находится в диапазоне от -20 до 20:

var floatValue = Number(value);
if (floatValue < -20 || floatValue > 20) {
    // Invalid!
}
0 голосов
/ 05 августа 2009

Требуемое регулярное выражение:

/[-+]?([01]?[0-9](\.[05]0?)?|(20(\.00?)?)/

Это разбивается на:

[-+]?  : an optional - or +
( 
 [01]?  : an optional 0 or
 [0-9]  : number 0-9
 (...)? : Optional
  \.    : .
  [05]  : 0 or 5
  0?    : Optional 0

  |      : OR

  20     : numbers 20
  (...)? : Optional
   \.    : .
   00?   : O or OO
)

Обратите внимание, что это допускает случайный угол "-00.00"

0 голосов
/ 05 августа 2009

Может быть проще проверить, что у вас есть 2 действительных числа с плавающей точкой (регулярное выражение хорошо, но можно использовать и parseFloat) и на последнем шаге программно проверить, что эти числа находятся в диапазоне [-20.0 - 20.0]

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