JavaScript отмечает последнее вхождение в регулярном выражении

У меня есть следующая задача: написать веб-страницу с двумя текстовыми областями T1 и T2. Пользователь вводит строку в текстовую область T1 для представления регулярного выражения. Затем пользователь вводит некоторый текст в текстовую область T2. Ваш код должен выводить текст T2 с выделенными элементами, соответствующими совпадениям для регулярного выражения T1. Дополнительное требование для моей задачи - соответствовать только последнему вхождению.

Это то, что я до сих пор:

<script>

var str = "This is really cooly";
str = str.replace(/\ly(?=[^\ly]*)$/, "BA");

document.write(str + '<br>');

</script>

но это только соответствует, если последнее слово оканчивается на "ly".

Мне удалось сделать это с помощью формы, но только для первого случая.

<html>
<body>

<p id="demo">Click the button to display the matches.</p>
<form name="My_form" id="My_form">
T1:<input type="text" name="T1" id="T1" size=200>
<br>
T2:<input type="text" name="T2" id="T2" size=200>

</form>
<br>
<button onclick="myFunction()">Try it</button>

<script type="text/javascript">
function myFunction()
{
  var regex = document.My_form.T1.value;
  var n = regex.match(document.My_form.T2.value);
  var result = regex.replace(n, '<b>$&</b>');
  document.getElementById('demo').innerHTML = result;
}
</script>

</body>
</html>

Я не знаю, как преобразовать пользовательский ввод в шаблон e для поиска в регулярном выражении (я не уверен, возможно ли это вообще. Это сжигает мой мозг более недели, и у меня есть менее 24 часов для завершения этот.

2 ответа

Решение

Большое спасибо за вашу помощь. Это было полезно, но я не уверен, покрывает ли оно требования задачи, так как считаю, что это алгоритм работы со строками.

Мне только что удалось выполнить мою задачу. Моя ошибка заключалась в том, что я пытался сопоставить выражение в функции replace(). Дело в том, что на самом деле выражение должно быть создано непосредственно с объектом RegExp.

Вот мой полный код:

var regex = new RegExp(document.My_form.T2.value+"(?!.*"+document.My_form.T2.value+")", 'g');
var result = document.My_form.T1.value.replace(regex, '<b><font color="blue">$&</font></b>');
document.getElementById("display").innerHTML=result;

Еще раз, большое спасибо за вашу помощь:)

Пользователь вводит строку в текстовую область T1 для представления регулярного выражения.

Если это действительно регулярное выражение, то вы можете попытаться перехватить исключение, которое выдается при передаче регулярного выражения RegExp конструктор, в случае, если ввод неверен. Я предполагаю, что регулярное выражение вводится без разделителей и флагов.

Если требование на самом деле просит вас найти T1 в T2, то вы можете просто использовать String.indexOf функция для поиска строки.

Ваш код должен выводить текст T2 с выделенными элементами, соответствующими совпадениям для регулярного выражения T1. Дополнительное требование для моей задачи - соответствовать только последнему вхождению.

Чтобы выделить текст, вам нужен индекс совпадений.

В строительстве RegExp например, передать в g (глобальный) флаг для конструктора. Тогда вы можете использовать RegExp.exec в цикле, чтобы узнать индекс и длину всех совпадений в соответствии с регулярным выражением.

var regex,
    arr,
    output;

try {
    regex = new RegExp(inputT1, 'g');
} catch (e) {
    console.log("Invalid regular expression");
}

while ((arr = regex.exec(inputT2)) !== null) {
    // Starting index of the match
    var startIndex = arr.index;

    // Ending index of the match
    var endIndex = arr.index + arr[0].length;

    // If you only want to highlight the last occurrence only, it can be done by
    // storing the result of previous call to RegExp.exec, then process it
    // outside the loop.

    // Hope you can figure out the rest

    // Advance the lastIndex if an empty string is matched
    if (arr[0].length == 0) {
        re.lastIndex += 1;
    }
}
Другие вопросы по тегам