Вычисление количества вхождений определенных слов в строку - PullRequest
0 голосов
/ 28 октября 2018

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

Я хочу подсчитать общее количество вхождений v | и adv | .Я использую приведенную ниже строку кода для этого

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
  (result.split("v|").length - 1) + (result.split("adv|").length - 1)
);

Теперь технически это должно быть 2, т.е. 1 для adv |и 1 для v |но на самом деле он считает v |в продвижении |и, таким образом, результат равен 3. Может ли кто-нибудь указать мне, что я должен сделать, чтобы считать оба отдельных слова?

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вы можете просто сначала убрать adv|, а затем работать на v|.поскольку adv| является надмножеством v|.

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";

const advSeparated = result.split("adv|");

const totalCount = advSeparated.reduce((acc, string) =>
  acc + (string.split('v|').length - 1)
, advSeparated.length - 1)


console.log(totalCount);
0 голосов
/ 28 октября 2018

Чтобы предотвратить совпадение, начинающееся "с середины слова", добавьте \b в начало регулярного выражения (к сожалению, JavaScript-выражение регулярного выражения не включите lookbehind) и передайте его как регулярное выражение (/.../), а не как строку ("...").

Обратите внимание, что аргумент split является регулярным выражением, а в регулярном выражении | имеет особое значение (альтернативный разделитель). Чтобы буквально соответствовать |, добавьте \.

Итак, первое регулярное выражение должно быть: /\bv\|/, а второе: /\badv\|/.

0 голосов
/ 28 октября 2018

Для секции 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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...