Проверка входной строки с регулярным выражением в JavaScript - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь протестировать входную строку формата AWT = 10: 15; на основе этого регулярного выражения, которое я написал: (([AWT]\w\S=)?(\d{0,9}:)?(\d{0,9});).

Проблема 1: Я получаю эту ошибку: Uncaught TypeError: Cannot read property '0' of undefined, когда пытаюсь сопоставить строку с регулярным выражением.

Проблема 2: Строка кажется действительной даже после того, как я ввожу это: AWT = 10: 15; 12 , чего не должно быть.

Вот мой код:

var reg = new RegExp('(([AWT]\w\S=)?(\d{0,9}:)?(\d{0,9});)');
var x = $('td').find('.awt')[0].value; 

console.log(x);        // AWT=10:15;
console.log(String(x).match(reg)); // [";", ";", undefined, undefined, "", index: 9, input: "AWT=10:15;", groups: undefined]

       if(String(x).match(reg)){
            console.log("valid");
        }else{
            console.log("Invalid")
        }

Мне было интересно, может ли кто-нибудь помочь мне определить правильное регулярное выражение для строки.

PS: строка должна быть в точном формате: (AWT = [0,9]: [0,9];) .

Ответы [ 3 ]

1 голос
/ 03 июня 2020

Ваше регулярное выражение (([AWT]\w\S=)?(\d{0,9}:)?(\d{0,9});) означает:

(                       # start group 1
    (                       # start group 2
        [AWT]                   # 1 character A or W or T
        \w                      # 1 word character <=> [A-Za-z0-9_]
        \S                      # 1 non space character
        =                       # equal sign
    )?                      # end group 2, optional
    (                       # start group 3
        \d{0,9}                 # from 0 upto 9 digits
        :                       # colon
    )?                      # end group 3, optional
    (                       # start group 4
        \d{0,9}                 # from 0 upto 9 digits
    )                       # end group 4
    ;                       # semicolon
)                       # end group 1

Оно соответствует AWT=10:15;, а также:

  • blahAWT=123456789:123456789;blah
  • Wx!=123;
  • 12345;

Не уверен, что это то, что вам нужно!


Согласно вашему запросу «Строка должна быть в точном формате: AWT = [0,9]: [0,9]; ”, это регулярное выражение выполнит задание: ^AWT=\d\d:\d\d;$

Пояснение:

^           # beginning of string
    AWT=        # literally AWT=
    \d\d        # 2 digits
    :           # a colon
    \d\d        # 2 digits
    ;           # a semicolon
$           # end of string

Используйте это так:

var reg = new RegExp('^AWT=\\d\\d:\\d\\d;$');

или, лучше:

var reg = /^AWT=\d\d:\d\d;$/;
0 голосов
/ 27 мая 2020

@ user120242 совершенно прав относительно причины вашей ошибки.

Я просто хочу добавить еще одну опцию вместо экранирования символов. Если вы используете /someRegex/, в этом нет необходимости.

Более того, если вы всегда ожидаете AWT в начале, этот ([AWT]\w\S=) не оптимален. Это означает: либо A, W или T, затем символ слова, затем символ без пробела и затем =. Если он всегда начинается с AWT=, используйте (AWT=).

var reg = /(([AWT]\w\S=)?(\d{0,9}:)?(\d{0,9});)/
var x = $('td').find('.awt')[0].value;

console.log(x); // AWT=10:15;
console.log(String(x).match(reg));

if (String(x).match(reg)) {
  console.log("valid");
} else {
  console.log("Invalid")
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tr>
    <td><input class="awt" value="AWT=10:15;"></td>
  </tr>
</table>
0 голосов
/ 27 мая 2020

Вам нужно избегать обратной косой черты в строке, иначе \ w станет w
Вам нужно использовать ^ $ для сопоставления в начале и в конце, поэтому он будет соответствовать, только если полная строка соответствует

Другой вариант в зависимости от того, что вы пытаетесь сделать, это использовать отрицательный просмотр вперед (?!.*)
или группу захвата за последним (;.*), где вы должны проверять совпадения для последней группы совпадений на предмет содержания и отклонять на основании этого.

console.log('(([AWT]\w\S=)?(\d{0,9}:)?(\d{0,9});)'); // this is not what you want

function matcher(){
var reg = new RegExp('^(([AWT]\\w\\S=)?(\\d{1,9}:)?(\\d{1,9});)$');
var x = $('td').find('input')[0].value;

console.log(x); // AWT=10:15;
console.log(x.match(reg)); // [";", ";", undefined, undefined, "", index: 9, input: "AWT=10:15;", groups: undefined]

if (reg.test(x)) {
  console.log("valid");
} else {
  console.log("Invalid")
}
}

matcher();
$('td').find('input').on('input',matcher);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table><tr>
<td><input class="awt" value="AWT=10:15;"></td></tr></table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...