Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение (https://javascript.ru/forum/misc/50853-regulyarnoe-vyrazhenie.html)

Ant_Jhon 15.10.2014 15:59

Тоесть если нет необходимости искать эти самы совпадения, то нужно использовать функцию test()?
var pattern = /(\d+)?\.?\d+\.?|^$/gm;
if (pattern.test(String)) {
Соответствует
}
else {
Не соответствует
}

Erolast 15.10.2014 16:04

Да.

danik.js 15.10.2014 16:06

Ant_Jhon, дык че по isNaN'ке?

terminator-101 15.10.2014 16:07

Цитата:

Сообщение от Ant_Jhon
если нет необходимости искать эти самы совпадения, то нужно использовать функцию test()?

Да, само сабой. Если ни одно из совпадений не обнаружено, он вернет false.

Ant_Jhon 15.10.2014 16:14

Даник, не понял вопроса.
Терминатор, тоесть эквивалентно ли вот это:
if (pattern.test(String)) {
Соответствует == Состоит только из символов описанных в pattern
}
Проще говоря записывая if (pattern.test(String)) я жду что вернется тру в том случае, когда строка String состоит из символов Pattern

danik.js 15.10.2014 16:20

Цитата:

Сообщение от Ant_Jhon
Даник, не понял вопроса

Ты здоров ваще?
Считаем:
Раз:
Цитата:

Сообщение от Ruslan_xDD
if(number == '' || (!isNaN(+number) && typeof +number == 'number')) alert('Это число!');

Два:
Цитата:

Сообщение от danik.js
А вобще, юзай !isNaN - мне кажется норм )

Три:
Цитата:

Сообщение от danik.js
Если да, то регулярка тебе нах не нужна.

if (!(input == '' || input == Infinity || isNaN(input))) {

}

Четыре:
Цитата:

Сообщение от danik.js
Ant_Jhon, дык че по isNaN'ке?


terminator-101 15.10.2014 16:26

Цитата:

Сообщение от Ant_Jhon
состоит из символов Pattern

Не состоит, а включает в себя. И не символы, а наборы (шаблоны)

Ant_Jhon 15.10.2014 16:29

Сорь потерял цепочку,
if (!(input == '' || input == Infinity || isNaN(input))) {

}
так тоже должно работать, только вот .1 будет не число, а это число которое хорошо парсится в дабл.

Erolast 15.10.2014 16:35

Уверен?
alert(isNaN(.1));

terminator-101 15.10.2014 16:41

Erolast,
Так у него строка подается а не число
зы вообще да, без разницы

terminator-101 15.10.2014 16:53

Цитата:

Сообщение от danik.js
if (!(input == '' || input == Infinity || isNaN(input))) {

}

А ты уверен, что ему это ветвление вообще нужно? Может достаточно вообще одного isNaN? по-моему, Infinity и "" и даже \n\n дают false на isNaN

danik.js 15.10.2014 17:05

terminator-101, да, с пустой строкой я затупил. Я наоборот, получается, запретил пустую строку.

А с Infinity затупил ты. Потому что Infinity - это число. Но мы его числом считать не хотим, поэтому отметаем.

danik.js 15.10.2014 17:10

Вот правильный вариант. Хотя проверка на пустоту не обязательна. Просто для наглядности, что пустую строку принимаем. И для уменьшения лишних расчетов (тупо из принципа).
if (input == '' || !(input == Infinity || isNaN(input))) {

}

terminator-101 15.10.2014 17:10

danik.js,
А с такой вот хренью что делать?
isNaN("\t")// false

Ant_Jhon 15.10.2014 17:11

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

terminator-101 15.10.2014 17:15

Ant_Jhon,
Только имей в виду, что если ты будешь проверять как ты ранее показывал, типа re.test(input), у тебя будут проходить строки типа "foo10bar", если тебе надо то, что строка содержит ТОЛЬКО эти совпадения и ничего более, или ТОЛЬКО ОДНО из этих совпадений, и ничего более, тут надо другое решение искать.

danik.js 15.10.2014 17:18

Цитата:

Сообщение от Ant_Jhon
проверка на не число проходить не будет как сказал терминатор тк передается строка

Че? Где он так сказал? Все там в порядке.
Цитата:

Сообщение от Ant_Jhon
проверка на инфинити вообще тут странное лишнее дело

Ну а вдруг кто-нибудь введет Infinity в инпут :D

Пока трабла в этом:
Цитата:

Сообщение от terminator-101
isNaN("\t")// false


terminator-101 15.10.2014 17:21

Цитата:

Сообщение от Ant_Jhon
проверка на не число проходить не будет как сказал терминатор тк передается строка

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

danik.js 15.10.2014 17:27

Думаю стоит просто удалять пробелы через input.trim(). При копипасте часто добавляется пробел справа, trim() бы тут помог.

terminator-101 15.10.2014 17:31

Цитата:

Сообщение от danik.js
пробел справа

Справа да, а если в середине?

terminator-101 15.10.2014 17:47

danik.js,
Но это, вообще то не проблема, можно просто регуляркой лишнее обрезать, да и все. Да, на первый взгляд подходит это решение, вроде.

terminator-101 15.10.2014 18:06

Ant_Jhon,
В твоем случае, если с регуляркой, напрашивается что-то вроде такого
test=function(input){
var re=/(\d+)?\.?\d+\.?|^$/
var s=input.match(re)
if(s){if(s[0]===input){...}}
}

в s[0] вернется паттерн, например, из foo10bar вернется 10, затем сравнивается с исходной строкой, действие наступает, только если совпало, например, 10 пройдет, а 10а -- нет. Глобальный и многострочный поиски тогда не нужны, никто в инпуте не будет с этим извращаться специально, если юзер нажимает энтер или таб, он выскакивает обычно из поля ввода, аоэтому нам нужно тут только первое введенное, более ничего, иначе все чертовски усложняется.

danik.js 15.10.2014 18:09

Цитата:

Сообщение от terminator-101
Справа да, а если в середине?

Это как? Не заметить сложно.
Или типа нормализовать число, введенное в свободном формате, типа 10 000? Ну тогда и запятые надо в точки трансформировать, и мож еще чего.

terminator-101 15.10.2014 18:16

Ant_Jhon,

Вот, проверил, вроде то что тебе надо, если нет, попробуем скорректировать, если чо.

test=function(input){
var re=/(\d+)?\.?\d+\.?|^$/
var s=input.match(re)
if(s) console.log(s[0]===input)
}

test(".1f") // false
test("111") // true
test("a23") // false
test("") // true
test("10.") // true
test("1a1") // false
test(".10") // true

Только с пустым пробелом то че делать? Приравнивать его к пустой строке или нет?

Ant_Jhon 15.10.2014 18:18

вощем изнан збс работает, тут паттерны не нужны. сори за шумиху:) сдела изнаном и забыл

Ant_Jhon 15.10.2014 18:21

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

Ant_Jhon 15.10.2014 18:22

Терминатор, попробую протестить щас скорректированный паттерн, тот не работал

terminator-101 15.10.2014 18:26

Цитата:

Сообщение от danik.js
запятые надо в точки трансформировать, и мож еще чего

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

terminator-101 15.10.2014 18:33

Цитата:

Сообщение от Ant_Jhon
Пробелы можно приравнять к пустой строке, мне кажется

Тогда вот такую регулярку попробуй
var re=/(\d+)?\.?\d+\.?|^(\s+)?$/
А что насчет запятых вместо точек в качестве разделителей?


Часовой пояс GMT +3, время: 08:46.