Javascript Regex - соответствие int после строки в цикле for

Я пытаюсь зафиксировать счетчики, связанные с ключевыми словами в строке txt. Все ключевые слова загружаются в массив заранее.

Этот код находится в jquery / javascript. Я не могу жестко закодировать строковые ключевые слова, поэтому они хранятся в массиве. Пожалуйста, помогите мне найти то, что идет вместо "Reg Expression" до и / или после ключевой переменной в цикле.

HTML br можно использовать для завершения этого регулярного выражения в этой итерации цикла.

Попытка закончить с keywordCount = "2, 5, 11"

//String I need to search through
var txt = "Edit Req'd2<br>Errors5<br>Pndg App11<br>";

//array of keywords I can use to find associated counts to keywords
var keyword = ["Edit Req'd", "Errors", "Pndg App"];

//empty string declared before loop
var keywordCount = '';

for (i = 0; i < keyword.length; i++) {

    // takes the comma off end of first entry in array
    // might not be needed or another method might be better?
    keyword[i] = $.trim(keyword[i]);

    //regex expression generated using keyword and unknown expression 
    var regexmatch = RegExp("Reg Expression" + keyword + "Reg Expression")

    //use regex expression to generate string containing counts
    keywordCount += (txt.match(regexmatch)) + ",";
}

Возможный дубликат Как найти число в строке с помощью JavaScript?

Robiseb 23.10.2018 14:55

Попробуйте: var regexmatch = RegExp (keyword [i] + "(\ d +)"), затем возьмите группу 1.

Poul Bak 23.10.2018 15:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
51
2

Ответы 2

Я бы использовал диапазон цифр / чисел для соответствия номеру ([0-9]; это довольно простой материал для регулярных выражений) и использовал бы группу для соответствия любому из ключевых слов:

  • Любое количество цифр: [0-9]+
  • Любое из ваших ключевых слов: (something|somethingelse|other)

Вы также можете использовать группы захвата, чтобы match() возвращал их отдельно:

var keyword = ["Edit Req'd", "Errors", "Pndg App"];
var regexmatch = RegExp('(\b' + keyword.join('|') + ')([0-9]+)', 'g')

(обратите внимание, что мы используем границу слова \b, чтобы убедиться, что ключевое слово не является частью более длинного слова, и флаг 'g' для global, чтобы сигнализировать, что нам нужно несколько результатов)

Теперь match() будет соответствовать только одному результату, и нам нужны совпадения для каждого ключевого слова, поэтому вместо этого мы будем использовать exec():

var txt = "Edit Req'd2<br>Errors5<br>Pndg App11<br>";
var keyword = ["Edit Req'd", "Errors", "Pndg App"];
var regex = RegExp('(\b' + keyword.join('|') + ')([0-9]+)', 'g')

var match = regex.exec( txt ); // ...find the first match
var numbers = [];

while ( match !== null ) {
  numbers.push( match[ 2 ]); // #0 of exec() its return-value is the result as a whole: "Edit Req'd2"
                             // #1 is the value of the first capture-group: "Edit Req'd"
                             // #2 is the value of the second capture-group: "2"

  match = regex.exec( txt ); // ...find the next match
}

console.info("the numbers are:", numbers);

Наконец, обратите внимание, что регулярные выражения могут выглядеть круто, это не всегда самый быстрый (с точки зрения производительности). Если производительность имеет большое значение, вы можете использовать (например) indexOf().


Из вашего вопроса кажется, что вы могли бы немного освежить свои знания о регулярных выражениях. Вокруг куча статей (просто ищите «основы регулярных выражений» или «regex 101») - вроде этого: https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285 *

Регулярное выражение JavaScript не поддерживает просмотр назад.

Poul Bak 23.10.2018 15:08

Спасибо, тестировал онлайн-тестером регулярных выражений и в консоли devtools, но, видимо, поленился; не все браузеры их поддерживают. Изменил ответ на что-то без оглядки.

Ruben Swieringa 23.10.2018 15:51

Вот пример, который может помочь вам в достижении желаемого результата.

//String I need to search through
var txt = "Edit Req'd2<br>Errors5<br>Pndg App11<br>";

//array of keywords I can use to find associated counts to keywords
var keyword = ["Edit Req'd", "Errors", "Pndg App"];

//empty string declared before loop
var keywordCount = '';
var i = 0;
var keywordCount = "";
var splittedValue = "";
while (i < keyword.length) {
    if (txt.indexOf(keyword[i]/i)) {
        splittedValue = txt.split(keyword[i]);
        if (keywordCount === "") {
            keywordCount = splittedValue[1].split("<br>")[0];
        } else {
            keywordCount += ", " + splittedValue[1].split("<br>")[0];
        }
    }
    i += 1;
}
console.info(keywordCount);

Другие вопросы по теме