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

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

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

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


person looneytunes    schedule 07.12.2015    source источник
comment
В javscript регулярное выражение заключено в символ /. Вы пробовали заменить кавычки на обратную косую черту? /^[^\\\./:\*\?\"<>\|]{1}[^\\/:\*\?\"<>\|]{0,254}$/.   -  person jperezov    schedule 07.12.2015
comment
вы использовали неэкранированный разделитель (/), поэтому вы получили эту ошибку.   -  person Shaishab Roy    schedule 07.12.2015
comment
@jperezov Я попытался удалить кавычки на концах, но все равно не работает   -  person looneytunes    schedule 08.12.2015


Ответы (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>

person Wiktor Stribiżew    schedule 07.12.2015

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

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

person tomgreen98    schedule 25.05.2017

Вы можете использовать \&quot; для выхода ".

person Alexandr Sargsyan    schedule 28.09.2017