Для секции v
вы можете иметь группу из двух букв, которые не являются ad
, чтобы гарантировать, что она не соответствует adv|
:
var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
(result.split(/(?:(?!ad)..|^.?)v\|/).length-1) +
(result.split("adv|").length-1)
);
https://regex101.com/r/f80iGd/1
/(?:(?!ad)..|^.?)v\|/
означает:
(?:(?!ad)..|^.?)
- группа, содержащая либо:
(?!ad)..
- две буквы, которые не ad
или
^.?
- начало строки или начало строки, за которыми следует одна буква
со всемиза ним следуют v\|
, v
, за которым следует литерал |
.
. Кроме того, вместо использования split
для создания разделяемого массива и проверки длины массива минус один, он можетбудьте более интуитивно понятны, чтобы использовать match
для совпадения с v|
или adv|
и проверять количество совпадений:
var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
result.match(/(?:(?!ad)..|^.?)v\|/g).length +
result.match(/adv\|/g).length
);
Обратите внимание, что в более новых средах Javascript вы также можете использовать отрицательный взгляд назад, чтобы убедиться, что v
не предшествует ad
:
var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
result.match(/(?<!ad)v\|/g).length +
result.match(/adv\|/g).length
);
(приведенный выше фрагмент может работать не во всех браузерах)
Вы также можете объединить два условия .match
в одно, используя дополнительную группу изad
:
var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
result.match(/(?:ad)?v\|/g).length
);