После 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 */ В чем тут секрет? |
Упс, день космонавтики 12 апреля, надо ж, забыл.
Сразу второй вопрос задам. Как переделать среднюю часть которая отвечает за месяц, чтобы она ловила не только текст, но и число месяца (1-12). При этом текст будет русский, а длина текста от 3 до полного названия месяца. И еще, оказывается в регах пробел как пробел имеет значение. А какой символ с экраном его заменяет конкретно? Чтобы не спейс передавать, а конкретную букву. Потому что мне надо будет заменить / на пробел, а пробелы сами знаете, вещь неустойчивая. |
kostyanet, дело в том, что в RegExp нужно экранизировать служебные символы в двойне, так как мы передаём строку, а в строке, как привило, все обратные слэшы служат для экранизации, например, тех же кавычек.
var re = new RegExp('^(\\d{1,2})(\\/|-)([a-zA-Z]{3})(\\/|-)(\\d{4})$'); Цитата:
|
Ага, спасибо, я уже нашел и вспомнил что напарывался на этот сук. На лбу бы вытатуировал, но экран у меня не блестящий, не вижу себя. Начинаю в срач-паде проводить эксперименты и забываю что надо же саму строку оформить. Через атрибут pattern все передается слава богу как есть.
Насчет \s - это не только space, это вообще все что на него похоже. Табы, переносы (кажется) и прочая хрень. С пробелом проблема визуального характера. У него ширина зависит от шрифта, два пробела могут выглядеть как один, или ни одного как пробел. Хотелось такой конкретный символ, чтобы пробел было видно, может там код его ввести? |
В общем на русский от 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})$/; Вот что делает \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,
:-? d.split(/\s+/) |
Цитата:
, я думаю. Или вот так /foo(?: )bar/ |
Фиг с ними с пробелами, я просто один раз их выкосил, подумал нафиг нужны, это ж выражение ж, и все поломалось, пришлось вбивать.
Нашел другое выражение, добил туда начало названий месяцев по-русски, но работает только если четко совпадает. $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-идиоту. |
Часовой пояс GMT +3, время: 14:22. |