Регулярное выражение для сопоставления только n вхождений символа в строке - PullRequest
0 голосов
/ 22 марта 2012

У меня есть строка типа 2005:10:29 12:23:53, и я хочу заменить только первые два вхождения : на -

Ожидаемый результат 2005-10-29 12:23:53

РЕДАКТИРОВАТЬ:

Мне нужно это регулярное выражение в инструменте krename KDE, где я не могу редактировать / форматировать оригинальный [exifExif.Image.DateTime], который возвращает нежелательный формат 2005:10:29 12:23:53, но есть Find and Replace для пост-обработки String

(?<=\d{4}):|:(?=\d{2}\s) выполняет работу на рублевом , но не в KDE: (

Я уверен, что есть и другие решения.

РЕДАКТИРОВАТЬ:

:(?=\d{2}:\d{2}\s)|:(?=\d{2}\s) работает даже на KDE

Я нашел это решение после того, как прочитал

You can use a full-fledged regular expression inside the lookahead.
Most regular expression engines only allow literal characters and
alternation inside lookbehind, since they cannot apply regular
expression backwards.

в учебник по регулярным выражениям

Ответы [ 4 ]

3 голосов
/ 22 марта 2012

В Ruby, как предполагает scibuff, вам, вероятно, лучше не использовать Regexps.

require 'date'
date = DateTime.parse("2005:10:29 12:23:53", "%Y:%m:%d %H:%M:%S")
date.strftime("%Y-%m-%d %H:%M:%S")
1 голос
/ 22 марта 2012

JavaScript:

Версия 1

str = str.split(' ')[0].replace(/\:/g,'-')+' '+str.split(' ')[1]

Версия 2

str = str.replace(/(\d{4}):(\d{2}):(\d{2})(.*)/,"$1-$2-$3 $4")

DEMO

0 голосов
/ 22 марта 2012

Просто позвоните replace() дважды:

"2005:10:29 12:23:53".replace(/:/,'-').replace(/:/,'-')
0 голосов
/ 22 марта 2012

Еще раз, используя регулярные выражения для чего-то, что может быть достигнуто более простым, элегантным и более эффективным способом

var date = new Date('2005:10:29 12:23:53');

, затем отформатируйте date соответственно, например,

function formatDate( date ){

    return date.getFullYear() + '-' + ( get.getMonth() + 1 ) + '-' + ... ;

}
...