24.10.2014, 06:42
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
После new RegExp null, а без new RegExp array
Один паттерн. Один скопипастен в аргумент RegExp, второй компилится по синтаксису.
var d = '11-apr-1961';
var re = new RegExp('^(\d{1,2})(\/|-)([a-zA-Z]{3})(\/|-)(\d{4})$');
var rx = /^(\d{1,2})(\/|-)([a-zA-Z]{3})(\/|-)(\d{4})$/;
d.match(re);
/*
null
*/
d.match(rx);
/*
11-apr-1961,11,-,apr,-,1961
*/
В чем тут секрет?
|
|
24.10.2014, 06:45
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Упс, день космонавтики 12 апреля, надо ж, забыл.
Сразу второй вопрос задам. Как переделать среднюю часть которая отвечает за месяц, чтобы она ловила не только текст, но и число месяца (1-12). При этом текст будет русский, а длина текста от 3 до полного названия месяца.
И еще, оказывается в регах пробел как пробел имеет значение. А какой символ с экраном его заменяет конкретно? Чтобы не спейс передавать, а конкретную букву. Потому что мне надо будет заменить / на пробел, а пробелы сами знаете, вещь неустойчивая.
Последний раз редактировалось kostyanet, 24.10.2014 в 06:50.
|
|
24.10.2014, 06:55
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
kostyanet, дело в том, что в RegExp нужно экранизировать служебные символы в двойне, так как мы передаём строку, а в строке, как привило, все обратные слэшы служат для экранизации, например, тех же кавычек.
var re = new RegExp('^(\\d{1,2})(\\/|-)([a-zA-Z]{3})(\\/|-)(\\d{4})$');
Сообщение от kostyanet
|
А какой символ с экраном его заменяет конкретно?
|
\s
Последний раз редактировалось ruslan_mart, 24.10.2014 в 06:58.
|
|
24.10.2014, 07:13
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Ага, спасибо, я уже нашел и вспомнил что напарывался на этот сук. На лбу бы вытатуировал, но экран у меня не блестящий, не вижу себя. Начинаю в срач-паде проводить эксперименты и забываю что надо же саму строку оформить. Через атрибут pattern все передается слава богу как есть.
Насчет \s - это не только space, это вообще все что на него похоже. Табы, переносы (кажется) и прочая хрень.
С пробелом проблема визуального характера. У него ширина зависит от шрифта, два пробела могут выглядеть как один, или ни одного как пробел. Хотелось такой конкретный символ, чтобы пробел было видно, может там код его ввести?
Последний раз редактировалось kostyanet, 24.10.2014 в 07:15.
|
|
24.10.2014, 07:24
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
В общем на русский от 3 до 7 сделал, а как числа для месяца туда добавить?
var d = '12 апреля 1961';
var rx = /^(\d{1,2})( |-)([а-яА-Я]{3,7})( |-)(\d{4})$/;
d.match(rx);
/*
12 апреля 1961,12, ,апреля, ,1961
*/
Кажется вот так
Код:
|
var rx = /^(\d{1,2})( |-)([а-яА-Я0-9]{2,7})( |-)(\d{4})$/; |
но пришлось уменьшить минимум, то есть можно написать теперь 12 ап 1967
Вот что делает \s
var d = '12\tян 1961';
var rx = /^(\d{1,2})(\s)([а-яА-Я0-9]{2,7})(\s)(\d{4})$/;
d.match(rx);
/*
12 ян 1961,12, ,ян, ,1961
*/
Последний раз редактировалось kostyanet, 24.10.2014 в 07:29.
|
|
24.10.2014, 08:20
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от kostyanet
|
два пробела могут выглядеть как один
|
/ {2}/
Сразу видно что пробела два )
__________________
В личку только с интересными предложениями
|
|
24.10.2014, 08:54
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Да х с ними, пусть табуляторы с переносами пишут, все равно дата валится одним длинным числом, ради которого ее бле надо распознать, а сперва проверит.
|
|
24.10.2014, 09:17
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,133
|
|
kostyanet,
d.split(/\s+/)
|
|
24.10.2014, 09:40
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от kostyanet
|
Хотелось такой конкретный символ, чтобы пробел было видно, может там код его ввести?
|
Я че то не знаю про такой. По идее, можно вот так /foo[ ]bar/
, я думаю. Или вот так /foo(?: )bar/
|
|
25.10.2014, 04:01
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Фиг с ними с пробелами, я просто один раз их выкосил, подумал нафиг нужны, это ж выражение ж, и все поломалось, пришлось вбивать.
Нашел другое выражение, добил туда начало названий месяцев по-русски, но работает только если четко совпадает.
$pat = '^(0[1-9]|[12][0-9]|3[01])[- .](0[1-9]|1[012]|янв|фев|мар|апр|мая|июн|июл|авг|сен|окт|ноя|дек)[- .](19|20)\d\d$';
Как сделать чтобы совпадало по началу названия, ну как в функции php strncmp(str1,str2,n) - где n количество символов от начала.
То есть рега матчит дату 12 янв 1987, а 12 января 1987 не матчит. Помогите regex-идиоту.
|
|
|
|