2013-03-01 5 views
0

Если в строке есть допустимые числа без начального нуля, например «.5», «+5» или «-5», как использовать RegExp для сопоставления такого шаблона, а затем добавить ведущий нуль?Как добавить ведущие нули, где это применимо?

Say,

s=".5x-.3/+.74x1.2" 

Я хочу, чтобы это было

0.5x-0.3/+0.74x1.2 

и использовать

(?!\d)([+-]?)(?!\d)(\.\d+) 

как шаблон и $10$2 как замена, но почему это не доставляет право вещи?

PS: Я использую VBScript RegExp двигатель в Excel

ответ

1

Замените (?<!\d)\.(?=\d) на 0., предполагая, что ваш аромат регулярного выражения поддерживает отрицательный внешний вид.

(?<!\d) является не предшествует цифра (отличной от \D которым будет предшествует символ, который не является цифрой и не будет совпадать, если строка начинается с .5), не потребляющего (отрицательный смотреть за).

\. dot (duh), потребляющий.

(?=\d) означает, что точка должна быть , а затем цифрой, не потребляющей (положительный прогноз).

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


Edit: Поскольку VBScript не поддерживает просмотровых задом, вы можете использовать несколько более сложную замену (\D|^)\.(?=\d) с $10. (предполагая, что аромат VBScript не пытается получить 10-й группы, которым JavaScript похоже, не делает). Часть (\D|^)\. будет соответствовать точке, которой предшествует либо начало строки, либо любой символ без цифры. Этот предыдущий персонаж потребляется, поэтому вам нужно вернуть его, следовательно, $1.

+1

Это не сработает - VBScript - это диалект ECMAScript, и поэтому утверждения lookbehind недоступны, как я подробно рассказал в своем ответе. –

+0

Спасибо, отредактировал ответ соответственно. –

+0

Спасибо всем, что сообщили мне _lookaround_ сейчас! @ работает код streetpc '(\ D | ^) \. (? = \ d)'. Атрибут VBScript не поддерживает _lookbehind_. Должны использовать этот способ для работы. – visualPaul

1
\B\. 

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

Почему ваше регулярное выражение не работает? Ну, это говорит

(?!\d) # Make sure the next letter isn't a digit 
([+-]?) # Try to match a sign (which never is a digit, so why the lookahead?) 
(?!\d) # Make sure the next letter isn't a digit (again) 
(\.\d+) # Match a dot and digits (the dot also isn't a digit, so again 
     # the lookahead is not necessary) 

Таким образом, вы можете полностью опустить первый предпросмотр, а второй опережения бы быть назад ' делать то, что вы хотите, чтобы это сделать (а именно утверждая, что характер до точка не цифра), но ECMAScript не знает lookbehinds, поэтому мы должны делать с якорями границы слова.

+0

Это не '\ D'" ничего, кроме цифры "? – Simon

+1

@Simon, это '\ B'" не [граница слова] (http://www.regular-expressions.info/wordboundaries.html) ", отрицание' \ b', а не '\ D' – stema

+1

Не работает ли это '.5x.5', потому что' .' предшествует буква? Кажется, что 'x' используется здесь для умножения. – Tim

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