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

Ant_Jhon 14.10.2014 17:54

Регулярное выражение
 
Требуется помощь в составлении регулярного выражение, которое бы проверяло на соответствие числам формата 11.22 (количество цифр до и после точки не имеет значения) и пустая строка так же подходит

Ant_Jhon 14.10.2014 17:55

написал такую строку, не пашет.
var pattern = /[0-9]|^$|\0/;

ruslan_mart 14.10.2014 17:57

var number = '11.22';
alert(/^\d+\.\d+$/.test(number));

Ant_Jhon 14.10.2014 18:00

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

Ant_Jhon 14.10.2014 18:04

да и еще одно уточнение, пустая строка подходит, 1234 (строка из просто цифр) подходит, 1234.12 (строка из целой и дробной части) тоже подходит

danik.js 14.10.2014 18:07

А .12 подходит? То есть без целой части?

terminator-101 14.10.2014 18:07

s="abc1.10\n\nab10.90f 20c"
re=/\d+\.?\d+|^$/gm
s.match(re)
// [ '1.10', '', '10.90', '20' ]

Ant_Jhon 14.10.2014 18:07

Проще наверно будет описать задачу:) есть несколько полей, поля соответствуют сумме покупки. есть кнопка сохранить. при нажатии на сохранить проверяем значения полей, при этом можем сохранить если ничего не ввели в поля, а так же если ввели целое 1234 или дробное 1234.56 числа

ruslan_mart 14.10.2014 18:08

var number = '11.22';
if(number == '' || (!isNaN(+number) && typeof +number == 'number')) alert('Это число!');


Можно через if. :)

Ant_Jhon 14.10.2014 18:10

danik.js, без целой части не подходит, те подходит 0.12 но не .12
terminator-101, а какая смысловая нагрузка в gm ?

danik.js 14.10.2014 18:10

А с экспонентой числа должна пропускать ? Например 1e2 ?

ruslan_mart 14.10.2014 18:11

var number = '11.22';
alert(/^(\d+(\.\d+)?)?$/.test(number));

terminator-101 14.10.2014 18:12

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

danik.js 14.10.2014 18:13

Цитата:

Сообщение от Ruslan_xDD
typeof +number == 'number'

Ну ну ))

alert([

typeof +'bla',
typeof +{},
typeof +[],
typeof +null,
typeof +undefined,
typeof +true

]);


И че те это дало? :D

Ant_Jhon 14.10.2014 18:16

вощем решил разбить один большой паттерн на несколько и сделать вложенные if else :) честно говоря походу тут не составить паттерн

terminator-101 14.10.2014 18:17

Ant_Jhon,
Цитата:

Сообщение от Ant_Jhon
но не .12

Я не понял из этой части та которая после точки должна матчится или нет?

ruslan_mart 14.10.2014 18:17

danik.js, ну я же прописал в условии !isNaN(+number). :)

Ant_Jhon 14.10.2014 18:18

дело осложняется тем что у меня допустим 3 поля, а каждое из них может быть как пустым так и целым так и дробным

terminator-101 14.10.2014 18:18

Цитата:

Сообщение от Ant_Jhon
походу тут не составить паттерн

Почему? мой вариант разве не работает?

ruslan_mart 14.10.2014 18:18

Ant_Jhon, а что не работает разве? http://javascript.ru/forum/misc/5085...tml#post335433

danik.js 14.10.2014 18:20

Цитата:

Сообщение от Ant_Jhon
вощем решил разбить один большой паттерн на несколько и сделать вложенные if else честно говоря походу тут не составить паттерн

Да ты гонишь ) Проверку на пустую строку, да, наверно лучше вне регулярки проводить.

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

Правдо оно принимает такие строки как:
.12
12.
1e2
Infinity

Но не пойух ли?

Ant_Jhon 14.10.2014 18:20

буду рад, если скажите как записать 3 отдельных паттерна:) тоесть:
паттерн 1 = числа
паттерн 2 = точка
паттерн 3 = пустая строчка

danik.js 14.10.2014 18:21

Цитата:

Сообщение от Ruslan_xDD
ну я же прописал в условии

Так а в каком случае typeof +number не будет равняться 'number' ?

Ant_Jhon 14.10.2014 18:21

терминатор, .12 не подходит

terminator-101 14.10.2014 18:24

Ant_Jhon,
Ну так я же спрашивал, тебе нужно что, чтобы оно целиком не входило или только точка из него не входила? Или чтобы оно целиком входило? Я запутался:)

danik.js 14.10.2014 18:24

Цитата:

Сообщение от Ant_Jhon
буду рад, если скажите как записать 3 отдельных паттерна тоесть:

Ответь все-таки чем тебе вариант из #12 не нравится?

ruslan_mart 14.10.2014 18:28

Цитата:

Сообщение от danik.js
Так а в каком случае typeof +number не будет равняться 'number' ?

Ладно, пофиг. :)

ruslan_mart 14.10.2014 18:28

Цитата:

Сообщение от danik.js
Ответь все-таки чем тебе вариант из #12 не нравится?

Наверное потому что отрицательные числа не принимает. :D

devote 14.10.2014 18:31

/^(?:|\-?\d+(?:\.\d+)?)$/

terminator-101 14.10.2014 18:32

Ant_Jhon,
короче если надо чтоб входило, попробуй вот так


s="abc1.10\n\nan.11kjb10.90f 20c"
re=/(\d+)?\.?\d+|^$/gm
s.match(re)
// [ '1.10', '', '.11', '10.90', '20' ]

Ant_Jhon 14.10.2014 18:33

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

danik.js 14.10.2014 18:47

Цитата:

Сообщение от Ant_Jhon
надо уточнить на счет .12

Дык пох на сервак. Кто числа вбивать будет? Если прогер - то ок. Он так может )
Ну а если тупой юзер или секретутка, то отсутствие целой части - скорее всего ошибка.

Ant_Jhon 14.10.2014 19:36

Итак, сори за паузу:) вообще говоря
double tmpParse = Double.parseDouble((String)".1");
log.info("tmpParse = " + tmpParse);
вот эта хрень неожиданно(для меня) выдала tmpParse = 0.1, тоесть выражения типа .1 и 1. допустимы :\

terminator-101 14.10.2014 19:41

Цитата:

Сообщение от Ant_Jhon
тоесть выражения типа .1 и 1. допустимы :\

Тогда вот так


s="ab<c1.10\n\n>)(*an.11kj5.b10.90f 20c"
re=/(\d+)?\.?\d+\.?|^$/gm
s.match(re)

// [ '1.10', '', '.11', '5.', '10.90', '20' ]

Ant_Jhon 14.10.2014 19:48

терминатор, можешь расписать на русском что означает эта конструкция
/(\d+)?\.?\d+\.?|^$/gm ?:) и как я уже спрашивал очень хочется узнать для чего на конце gm? на сколько смог понять из гугла регЭкспы ставятся внутри /../

Ant_Jhon 14.10.2014 19:49

Млять тоже хочу уметь делать такие штуки /(\d+)?\.?\d+\.?|^$/gm

terminator-101 14.10.2014 19:51

Ant_Jhon,
Мне щас некогда, уходить надо, потом. Пока почитай про регекспы на этом сайте, там есть, по-моему.

Ant_Jhon 14.10.2014 19:52

Хорошо, спасибо всем за помощь:thanks:

danik.js 14.10.2014 20:21

Цитата:

Сообщение от Ant_Jhon
вот эта хрень неожиданно(для меня) выдала tmpParse = 0.1, тоесть выражения типа .1 и 1. допустимы

Ну ты удивишься если скормишь туда числа типа 1e2.
Ты уверен что тебе нужно пропускать такой формат?

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

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

}

terminator-101 15.10.2014 12:39

Ant_Jhon,
Означает следующее
все \d+ означают 1 или более цифровых символов, тут \d -- метасимвол, означающий диапазон 0-9 (эквивалентен [0-9]), он совпадает с любым 1 цифровым символом, а + означает 1 или более вхождений предыдущего символа. Все ? означают 0 или 1 вхождение предыдущего шаблона. а \. означает просто совпадение с точкой (экранирование для того, чтобы отменить интерпретацию точки как метасимвола). Флаг g означает глобальный поиск, значит в строке foofoo /foo/g найдет 2 foo, а /foo/ -- только первое. m -- это флаг многострочного поиска, это значит(конкретно в JS), что символы ^ и $ будут работать со всеми переносами строк, а не только с началом и концом всей строки.

Ну ты наверное знаешь, но на всякий случай, | означает or, а ^$ -- совпадение с пустой строкой, само-сабой

Вот еще что забыл сказать. Если ты работаешь с файлами, в которых виндовские переносы строк, типа \r\n, ты должен эти строки сначала очистить от всех \r, например вот так

s=s.replace(/\r\n/g, "\n")

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

s="ab<c1.10a\r\n\r\n>)(*an.11kj5.b10.90f 20c"
re=/(\d+)?\.?\d+\.?|^$/gm
//s=s.replace(/\r\n/g, "\n")
s.match(re)

// [ '1.10', '', '', '', '.11', '5.', '10.90', '20' ]


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