2016-11-29 3 views
2

Я использую директиву AngularJS для проверки правильности ввода формы. Есть ли способ заставить мое регулярное выражение допускать только один специальный символ (:) вместе с числами и алфавитами. Это директива, которую я нашел в stackoverflow.Regex, чтобы разрешить специальный символ (:) и только цифры и алфавиты

 myapp.directive('noSpecialChar', function() { 
    return { 
     require: 'ngModel', 
     restrict: 'A', 
     link: function(scope, element, attrs, modelCtrl) { 
      modelCtrl.$parsers.push(function(inputValue) { 
       if (inputValue == null) 
        return '' 
        cleanInputValue = inputValue.replace(/[^\w\s]/gi, ''); 
        cleanInputValue = cleanInputValue.toUpperCase(); 
       if (cleanInputValue != inputValue) { 
        modelCtrl.$setViewValue(cleanInputValue); 
        modelCtrl.$render(); 
       } 
       return cleanInputValue; 
      }); 
     } 
    } 
}); 

Я пробовал добавить двоеточие в конце, но я не могу достичь своего решения.

+1

Попробуйте '.replace (/^([^:] * :) | [^ \ w \ s]/g, function ($ 0, $ 1) {return $ 1? $ 1.replace (/ [^ \ w \ s ] +/g, '') + ':': '';}) 'вместо' .replace (/ [^ \ w \ s]/gi, '') ' –

ответ

2

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

При этом регулярное выражение [^\w\s:] должно работать.

\w = аз, AZ, 0-9

\s = пробельные символы \ г \ п \ т \ е \ v

Я бы даже рассматривать удаление \s как это позволило бы пробелы в вашем ввод, если это не ваше намерение.

+0

НЕТ Я не хочу, чтобы пробелы были разрешены. Я просто хочу, чтобы двоеточие было разрешено вместе с \ w = a-z, A-Z, 0-9 – Praveen

+0

Хорошо, тогда вы хотели бы использовать '[^ \ w:]' только тогда. '\ s' соответствует символам пробела. – jj27

1

Использование .replace(/^([^:]*:)|\W/g, function($0,$1) { return $1 ? $1.replace(/\W+/g,'')+':' : ''; }) вместо .replace(/\W/gi, '')

Смотрите следующую демо:

var s = "(*a word : 156,567-354 *)"; 
 
console.log(s.replace(/^([^:]*:)|\W/g, function($0,$1) { return $1 ? $1.replace(/\W+/g,'')+':' : ''; }));

/^([^:]*:)|[^\w\s]/g регулярное выражение будет соответствовать и захватить в группе 1 0+ другие символы, чем : и : , OR будет соответствовать любому символу, который не является словом или пробелом. Если группа 1 соответствует, все содержимое удаляется из символов, отличных от слов и пробелов, и добавляется :, иначе совпадающие символы с [^\w\s] удаляются.

+0

Я тоже не хочу пустое пространство. есть ли способ, которым я мог это сделать – Praveen

+0

Вы хотите удалить все пробелы? Я отредактировал ответ. Главное, чтобы заменить '[^ \ w \ s]' на '\ W', так как' \ W' соответствует любому символу слова, а '[^ \ w \ s]' соответствует любому символу, отличному от слова и пробельный символ. –