Javascript 使用正则表达式在JS中进行复杂的已知字符串匹配
我正在为一个在线TTRPG平台编写一个名字替换脚本,但我在正则表达式方面非常差 目前,我有以下代码,可以在许多情况下正确替换名称:Javascript 使用正则表达式在JS中进行复杂的已知字符串匹配,javascript,jquery,regex,Javascript,Jquery,Regex,我正在为一个在线TTRPG平台编写一个名字替换脚本,但我在正则表达式方面非常差 目前,我有以下代码,可以在许多情况下正确替换名称: el.innerHTML=el.innerHTML.replace(新的RegExp(“\\b”+data.alias+“\\b”,“gi”),replacement); 在本例中: 数据。别名是“生物”的名称,它可以像强盗一样简单,也可以像地精王(变体1)一样复杂 replacement是用户选择的字符串,例如未知生物 示例el可能类似于: Bandit 或者可
el.innerHTML=el.innerHTML.replace(新的RegExp(“\\b”+data.alias+“\\b”,“gi”),replacement);
在本例中:数据。别名
是“生物”的名称,它可以像强盗
一样简单,也可以像地精王(变体1)
一样复杂
replacement
是用户选择的字符串,例如未知生物
示例el
可能类似于:
Bandit
或者可能是:
众所周知,地精王(变体1)藏身于潮湿黑暗的洞穴中
以下问题使我在试图找到正确的匹配模式时感到痛苦:1.对于常见的单词名,如
bandit
,我不希望模式与bandity
2.对于包含非单词字符的名称(如
(
),我当前的单词边界匹配失败。我不确定是否简单地转义所有特殊字符是明智的选择
如果名称是已知数量,是否有一种模式可以精确匹配名称?如果使用负向前看和向后看而不是单词边界,应该可以做到这一点。但是,您需要转义特殊的正则字符,例如
小妖精王(变体1)
中的括号
尝试一下:
el.innerHTML=el.innerHTML.replace(新的RegExp((?![^\\s,.!?;:])“+data.alias+”(?我不确定我是否理解--您正在替换一个已知的显式字符串,为什么不能使用replace
替换该字符串?@DaveNewtonreplace
函数仅替换字符串的一个实例,除非您使用带有g
全局变量的正则表达式版本的字符串tag@errational“\\b的目的是什么“
在你的正则表达式的开头和结尾?@ChrisSandvik我已经在这方面进行了多次迭代,但我相信这是为了删除“bandit”的“bandity”场景。我假设您知道它在正则表达式中的含义,但如果不清楚它定义了一个单词或字符串边界。如果您有无限的输入,最终这将是相当困难的,例如,“Bandit,作为一个Bandit,开始做类似Bandit的事情。”除非你知道边界,否则一个简单的搜索和替换很可能会产生意想不到的副作用。这已经非常接近了!我到处玩了,我想我想要的是一个负面的单词lookahead。这样一来,bandit
将匹配bandit、
或bandit.
而不是bandity
。我很高兴我猜在我的目标字符串中转义特殊字符最简单的方法就是在传递到实际的正则表达式语句之前对它们进行替换?哦,我不知道你必须处理标点符号。我会编辑答案来解释这个问题。好的,我想我有一个计划。这并不完美,但我认为它正在变得更好。这是我的考试ple:基本上在我的JS中,我会将任何带有空格的名称分解为组件组,然后对这些组进行级联匹配