0

我有以下任务要做:编写一个包含两个文本区域 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 小时的时间来完成这个。

4

2 回答 2

0

用户在文本区域 T1 中输入字符串以呈现正则表达式。

如果它确实是一个正则表达式,那么您可能希望尝试捕获将正则表达式提供给RegExp构造函数时抛出的异常,以防输入无效。我假设输入的正则表达式没有分隔符和标志。

如果需求实际上要求您在 T2 中找到 T1,那么您可以使用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;
    }
}
于 2013-05-26T05:34:31.280 回答
0

非常感谢你的帮助。这很有帮助,但我不确定它是否涵盖了任务的要求,因为我认为它是一个字符串操作算法。

我只是设法完成了我的任务。我的错误是我试图匹配 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;

再次感谢您的帮助:)

于 2013-05-26T19:53:09.553 回答