Шаблон ng с регулярным выражением, имеющим двойные кавычки, не корректно экранируется

У меня есть проверка ng-шаблона для регулярного выражения ^[^\./:*\?\"<>\|]{1}[^\/:*\?\"<>\|]{0,254}$ который в основном проверяет недопустимые символы в filepath и teh limit. но когда у меня есть ng-шаблон, указанный как

 ng-pattern = "^[^\\\./:\*\?\"<>\|]{1}[^\\/:\*\?\"<>\|]{0,254}$"

шаблон ng неверно показывает регулярное выражение. любая помощь в достижении этого правильно

3 ответа

Решение

Прежде всего, ваше регулярное выражение содержит слишком много экранирующих символов, в то время как вам нужно только избежать " здесь и \\,

Затем, чтобы соответствовать " внутри ng-pattern атрибут, вы можете определить его как \x22 или же &quot;:

var app = angular.module("app", []);
<html ng-app="app">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</head>
<body>
<form name="form">
  <p>Enter text to validate:</p>
  <input type="text" ng-model="name" name="name" ng-pattern="/^[^\\\\./:*?&quot;<>|][^\\\\/:*?\x22<>|]{0,254}$/" ng-trim="false" />
  <div ng-show="form.name.$error.pattern">Text doesn't match with ng-pattern!</div>
</form>
</body>
</html>

Вы также можете решить эту проблему, задав регулярное выражение в контроллере с помощью обычного строкового литерала, где вы можете использовать '.."..' или же "..\"...", а затем использовать имя переменной внутри {{...}} в ng-pattern приписывать. Обратите внимание, чтобы соответствовать буквальному \ вам нужно использовать 4 обратных слеша в шаблоне регулярных выражений.

var app = angular.module("app",[]);

app.controller("FormCtrl", function($scope) {
  $scope.regex = "/^[^\\\\./:*?\"<>|][^\\\\/:*?\"<>|]{0,254}$/";
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <form name="theForm" ng-controller="FormCtrl" novalidate>
        <input type="text" name="filename" placholder="filename" ng-model="filename" ng-pattern="{{regex}}" required />
        <div class="error"
                     ng-show="(theForm.filename.$dirty || attempted) && theForm.filename.$invalid">
                  <small class="error text-danger"
                         ng-show="theForm.filename.$error.required">
                    Please enter a file name.
                  </small>
                  <small class="error text-danger"
                         ng-show="theForm.filename.$error.pattern">
                    Please enter a valid file name.
                  </small>
                </div>
    </form>
</div>

Я пытался исключить "и" в ng-шаблоне, который похож на проблему выше. Я нашел способ встраивать "или" напрямую, без использования переменной области видимости:

<input type="text" ng-pattern="/^[^&#34&#39]+$/" />

Ты можешь использовать \&quot; Сбежать ",

Другие вопросы по тегам