Почему строка с регулярным выражением ведет себя странно? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть фрагмент кода, как показано ниже:

    let regex = /^[^aeiou]+(?=[aeiou])/;
    let regexStr = "hhhhello".match(regex);
    console.log(regexStr.length); // prints 1

Разве это не должно печатать 4? Однако, если я добавлю "" к regexStr, он покажет правильное значение.

    let regex = /^[^aeiou]+(?=[aeiou])/;
    let regexStr = "hhhhello".match(regex) + "";
    console.log(regexStr.length); // prints 4

Может кто-нибудь объяснить, что происходит?

Ответы [ 3 ]

1 голос
/ 14 марта 2020

Потому что string.match () на самом деле возвращает массив всех совпадающих значений. В вашем случае это только 1.

Когда вы добавляете "", вместо этого он преобразуется в строковое значение.

Для получения дополнительной информации вы можете проверить эти документы на строку. совпадают ()

1 голос
/ 14 марта 2020

В вашем примере regexStr - это массив с одним элементом, строка hhhh. Добавляя строку, вы неявно преобразуете в строку, которая затем имеет длину 4. Вы можете просто использовать regexStr[0].length.

0 голосов
/ 14 марта 2020

Регулярное выражение /^[^aeiou]+(?=[aeiou])/ соответствует только одному чанку из 1+ символов, отличных от a, e, i, o, u, за которыми следует a, e, i, o или u букв, в начале строки.

Вы можете использовать

let regex = /[^aeiou](?=[^aeiou]*[aeiou])/gy; 
let regexStr = "hhhhello".match(regex);
console.log(regexStr.length); // prints 4, regexStr = ["h", "h", "h", "h"]

/[^aeiou](?=[^aeiou]*[aeiou])/gy соответствует только с начала строки благодаря модификатору y sticky , тогда как g сделает его совпадающим несколько раз до первой ошибки.

  • [^aeiou] - соответствует 1 символу, отличному от a, e, i, o и u
  • (?=[^aeiou]*[aeiou]) - если за ним сразу следует 0 или более вхождений этих символов с 1 буквой, a, e, i, o или u.

См. regex demo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...