TypeError: pattern.test не является функцией

Я пишу регистрационную форму, в которую включена тонна javascript. При написании основных функций для проверки формата определенных строк я столкнулся с этой проблемой (я попытался решить ее сам, но не повезло). В этой упрощенной версии у меня есть три функции: один для проверки формата номера телефона, второй для проверки формата электронной почты и третьего, чтобы объединить эти две функции, чтобы сделать его более понятным. Здесь код:

<html>
<head>
    <meta charset="utf-8">
    <script>
        function filterPhone(phone){
            var pattern = "/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/";
            return pattern.test(phone);
        }

        function filterEmail(email) {
            var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            return regex.test(email);
        }

        function checkForm(){
            var puh = document.getElementById("puh").value;
        var email = document.getElementById("email").value;
            if(filterPhone(puh) && filterEmail(email)){
                alert("It works");
                return true;
            } else {
                alert("Check the format!");
                return false;
            }
        }
    </script>
</head>
<body>
<form method="post" action="" name="regForm" onsubmit="return checkForm()">
    <input type="text" name="puh" id="puh" placeholder="Phonenumber"><br>
    <input type="text" name="email" id="email" placeholder="Email address"><br>
    <input type="submit" value="Check!">
</form>
</body>
</html>

Если я использую функцию filterEmail, он отлично работает, но когда я использую их как (или даже только filterPhone!), он дает мне ошибку: "TypeError: pattern.test не является функцией" ( "шаблон", ссылающийся на имя переменной первой функции (filterPhone), называемое шаблоном). Я попытался использовать exec() вместо test() и изменить шаблон regex, и не сработал. Это довольно странно, поскольку синтаксис кажется правильным. Почему может быть причина?

Ответ 1

Ваш pattern должен быть литералом RegEx (двойные кавычки вокруг этого не должны быть), как этот

var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/;

В противном случае вам нужно использовать RegExp объект с соответствующим экранированием для \, как этот

var pattern = new RegExp("^(()?\\d{3}())?(-|\\s)?\\d{3}(-|\\s)?\\d{4}$");

Ответ 2

Ваш шаблон содержит строку , а не регулярное выражение.

Сделать var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/; (без кавычек)