Javascript 是否可以获取匹配正则表达式的值?如果是,应如何做?

Javascript 是否可以获取匹配正则表达式的值?如果是,应如何做?,javascript,regex,Javascript,Regex,下面是我制作的一个小语法荧光灯的代码。它应该搜索我的.html文件中的每个代码标记,并突出显示其中的某些部分。一旦在浏览器中运行,我会在每一行我有一个关键字的地方看到一个奇怪的“关键字”>文本。经过一些调试,我仍然没有找到解决方案,也没有找到出现此问题的原因。我确实注意到,当我从code标记中删除ids时,“关键字”>消失,但文本仍然没有突出显示 如果我手工编写代码,而不是使用JavaScript为我编写代码,那么一切都可以正常工作,但问题是这个过程非常耗时,我还有很多代码片段要编写。是否有任何

下面是我制作的一个小语法荧光灯的代码。它应该搜索我的
.html
文件中的每个代码标记,并突出显示其中的某些部分。一旦在浏览器中运行,我会在每一行我有一个关键字的地方看到一个奇怪的
“关键字”>
文本。经过一些调试,我仍然没有找到解决方案,也没有找到出现此问题的原因。我确实注意到,当我从
code
标记中删除
id
s时,
“关键字”>
消失,但文本仍然没有突出显示

如果我手工编写代码,而不是使用JavaScript为我编写代码,那么一切都可以正常工作,但问题是这个过程非常耗时,我还有很多代码片段要编写。是否有任何方法可以从
关键字
中获取匹配的关键字,并以某种方式将其包括在内?有没有一种方法可以像在数组中一样迭代正则表达式?提前感谢:)

图1(部分成功): 我不得不手动添加
span
标记(删除不需要的文本),但高亮显示不起作用

图2(错误图像):

CSS代码(内联)

.keyword{color:#c792ed;}
.标识符{颜色:#a6acce;}
.string{color:#6401e5;}
.int{color:#f78c6a;}
.comment{color:#69aa00;}
/*
#代码0,#代码1
^----->^----->未定义
*/
Html代码



text=“我想要两个比萨饼”;//这是一根绳子。它保存文本字符

设ovenOn=true;//这是一个布尔值。其值为“真”或“假”。

JavaScript代码(内联)

设d=document;
设i=0;
//---------------->定义变量
函数高亮显示(){
让tags=d.getElementsByTagName(“代码”);
让保留="抽象参数等待布尔值中断字节大小写捕获字符类常量继续调试器默认删除double else枚举评估导出扩展函数的false final float goto如果在instanceof int接口中实现导入让long native new null package private protected public返回短静态超级开关同步此行在具有收益率的情况下抛出var void volatile的瞬时真try typeof”;
对于(i;我应该在关键字中捕获关键字(失败)
//^--->参见图2
代码=代码。替换(/“(.*)”/g,“$1”);
//^--->捕获字符串并将内容放在引号之间(工作)
代码=代码。替换(/\/\/(.*)/g,“/$1”);
//^--->捕获单行评论(作品)
标记[i].innerHTML=code;
}
}
window.addEventListener(“加载”,高亮显示);
//^----->调用highlight();

我认为问题在于如何编写HTML字符串。如果使用模板文字(反勾号)而不是引号,我认为您获得了所需的功能

这里有一个我认为有效的例子

let reserved =
'abstract arguments await boolean'; // have simplified

const keywords = new RegExp(reserved.split(' ').join('|'));

const sample = `<code>let a = new boolean(true);</code>`;

const example = `<span class="keyword">$1</span>`;

console.log(sample.replace(keywords, example));

/* Returns:
<code>
let a = new <span class="keyword">$1</span>(true);
</code>
*/


我在函数中修复了一些东西

函数高亮显示(){
让tags=d.getElementsByTagName(“代码”);
//我将保留变量和关键字变量移出for循环,这样就不会为每个代码元素重新初始化它
//最好将保留字包装在字边界中,这样,如果保留字在另一个字中,就不会被替换。
//示例:“with”作为保留字将影响“without”
让我离开这里\\b(抽象参数等待布尔中断字节大小写catch char class const continue调试器默认delete do double else enum eval export extends false final final float for function goto if import in instanceof int interface let long native new null package private protected public return short static super switch synchronized this t throw抛出var void volatile的瞬时真try类型,而收益率为)\\b”;
//'我向RegExp传递了一个全局标志,因此所有出现的保留字都将被替换'
const keywords=newregexp(reserved.split(“”).join(“|”),“g”);
//for循环没有运行,因为我没有初始化。
for(设i=0;i)“(.?)”/g,“$1”);
代码=代码。替换(/\/\/(.*)/g,“/$1”);
标记[i].innerHTML=code;
}
}
//你的一个例子应该返回这个。

//let text=“我想要两个比萨饼”;//这是一个字符串。它包含文本字符
请告诉我是否应该在我的评论中添加更多内容仅供参考:使用单个反勾(
`
)对于内联代码。三个反勾号创建了一个防护代码块,您似乎并不是有意在您的段落中创建的。非常感谢。我将立即进行编辑。在每个步骤(例如,记录它)确定
code
的值。您将看到,应该高亮显示字符串的代码也会找到一个“字符串”“在您的
标记内部-您刚刚插入的
中的
”关键字“
”,并将继续销毁您的HTML。我建议您首先对代码进行HTML编码(您无论如何都需要这样做,以避免错误的渲染和XSS攻击),然后匹配已编码的代码(查找
,而不是
,等等。)@GruelingPine185没有必要-我已经修复了它们。只是让你知道,以备将来参考。