2015-05-08 4 views
6

У меня есть регулярное выражение, которое работает на regexplib.com, когда я тестирую его с помощью .NET-движка. Он не находит соответствия с JavaScript. Я также попробовал JSFiddle с приведенным ниже кодом. Он не находит соответствия. Он возвращает null.регулярное выражение не работает с javascript

var re = RegExp('^\d+(?:\.\d{0,1})?$'); 
var myString = "123"; 
alert(myString.match(re)); 

Я пытаюсь использовать нижеследующий javascript на веб-странице aspx. Он не находит совпадений. Я открыт для идей.

function ValidateData(ControlObj, ColumnType) { 
var re = new RegExp('^\d+(?:\.\d{0,1})?$'); 

if (!ControlObj.value.match(re)) { 

ответ

8

Лучше использовать регулярное выражение буквального вместо объекта регулярного выражения:

var re = /^\d+(?:\.\d?)?$/; 
var myString = "123"; 
alert(myString.match(re)); 

Если пока вы строите регулярное выражение динамически нет необходимости использовать RegExp объект.

В противном случае RegExp объект должен двойное экранирование, как:

var re = RegExp('^\\d+(?:\\.\\d?)?$'); 

Причина для двойного экранирования является то, что RegExp объекта принимает строку в качестве входных данных и экранирования необходимо сначала для строки и второго для регулярных выражений.

кстати \d{0,1} можно заменить \d?

+1

Пожалуйста, объясните, почему двойной побег необходимо. Если нет, я добавлю его позже. – RudePeopleStepOff

+1

Спасибо за комментарий, я добавил несколько объяснений. – anubhava

+1

Неверно, что * \ d {0,1} можно заменить на \ d **. '\ d {0,1}' совпадает с '\ d?' как '?' означает «0 или 1, жадный». Смотрите мой пост. –

3

Используйте двойной слэш спасся:

var re = RegExp('^\\d+(?:\\.\\d{0,1})?$'); 

И он должен работать.

В JavaScript вы можете использовать литералы и конструктор. В буквальной нотации (см. Предложение anubhava), вам нужно добавить / ... /, а затем вам не нужно скрывать косые черты. При использовании объекта RegExp (конструктор) вы должны избегать обратных косых черт.

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

var re = /^\d+(?:\.\d?)?$/; 

\d{0,1} такое же, как \d?, как ? означает 0 or 1, greedy.

См. more about that difference on MDN.

Литеральная нотация обеспечивает компиляцию регулярного выражения при вычислении выражения. Используйте литеральную запись, когда регулярное выражение останется постоянным. Например, если для построения регулярного выражения, используемого в цикле, используется , то регулярное выражение не будет перекомпилировано на каждой итерации.

Конструктор объекта регулярного выражения, например, новый RegExp ('ab + c'), обеспечивает компиляцию времени выполнения регулярного выражения . Используйте функцию конструктора, когда вы знаете, что шаблон выражения будет меняться, или вы не знаете шаблон, и получают его из другого источника, такого как ввод пользователя.

При использовании функции конструктора нормальные правила escape строки (предшествующие специальные символы с \ при включении в строку) необходимы .