2013-04-17 2 views
2

У меня есть str.replace(/.(?![0-9])/g, '').
Но он удаляет все, кроме периода и цифры после периода.
Например, «3,14» становится»+0,1"regex удалить все периоды, которые не соответствуют цифрам

Что я хочу:

"3.14" -> "3.14" 
"hello.world" -> "helloworld" 
".hi." -> "hi" 
"hi.25" -> "hi.25" 

Что такое регулярное выражение для этого?

+2

Побег точки, '/ \. (?! \ D)/g'. –

ответ

3

. - метасимвол (соответствует любому символу, кроме разрывов строк по умолчанию) в регулярных выражениях. Вы должны избежать этого:

str.replace(/\.(?![0-9])/g, '') 

или

str.replace(/[.](?![0-9])/g, '') 

в зависимости от ваших предпочтений.

Обратите внимание, что вы можете заменить [0-9] на \d.

+0

+1 для указания \ d. – Adrian

+0

Он работает! Спасибо за быстрый ответ! – user2291835

+0

добро пожаловать. пожалуйста, подумайте о принятии ответа, нажав галочку рядом с ответом. что даст мне некоторый кредит и, что более важно, покажет будущим посетителям, как и как ваша проблема была решена. –

3

Если вы не уходите от точки, это означает «соответствовать любому персонажу».

str.replace(/\.(?![0-9])/g, '') 
1

В то время как другие правильные ответы, я укажу другой вариант (который не использует смотреть вперед):

str.replace(/\.+([^0-9]|$)/g, '$1') 

$1 является специальный синтаксис, чтобы вернуть вещь, которая соответствовал первому набору скобок.


Оказывается, что этот метод медленнее, чем опережающего просмотра (http://jsperf.com/regexp-look-ahead-speed), но я до сих пор считаю, что это интересно, как другой вариант. Я лично считаю, что захват жетонов, как это, более интуитивно и гибко. Но если вам нужна скорость, идите с другими.

+0

Вы уверены, что внешний вид имеет большее влияние на производительность, чем захват (что также довольно дорого)? Я думаю, вам следует предоставить хотя бы простой ориентир с этим требованием. Также конец строки будет исправлен с помощью '([^ 0-9] | $)', который вы можете добавить. –

+0

@ m.buettner уверен, работая сейчас. – Dave

+0

100 000 повторений вашего и моего шаблона на '.hi.25.foo.' дает ~ 155 мс для вашего подхода и ~ 140 мс для моего. Я ценю, что вы показываете другое возможное решение, но (по крайней мере, для текущего случая) утверждение о том, что захват быстрее, чем просмотр, просто неверно. –

Смежные вопросы