Javascript 如何从圆括号中获取所有单词,然后用html div代码替换所有单词 var message=$(“textarea”).val(); var matches=message.match(/\(.*?)/); 如果(匹配){ var submatch=message.replace(“(“+匹配[1]+”)”,”); 控制台日志(子匹配);
Javascript 如何从圆括号中获取所有单词,然后用html div代码替换所有单词 var message=$(“textarea”).val(); var matches=message.match(/\(.*?)/); 如果(匹配){ var submatch=message.replace(“(“+匹配[1]+”)”,”); 控制台日志(子匹配);,javascript,Javascript,message变量是一个文本区域,div是一个CSS图像,带有一个笑脸,在我的聊天应用程序上显示笑脸。当我使用时,“这是(笑脸1)和(笑脸2)”,子匹配变量只显示笑脸1,笑脸2用括号保持不变;如“这是笑脸1和(笑脸2)”。我无法用id获取此DIV(smiley2)这包括方括号,因为id没有方括号,但我需要方括号,因为这是一条带微笑的聊天消息,在方括号中。String#replace可以通过regex进行替换,这正是您试图做的。使用g标志使其成为一个全局regex,可以匹配多个内容。提供回调函数i
message
变量是一个文本区域,div
是一个CSS图像,带有一个笑脸,在我的聊天应用程序上显示笑脸。当我使用时,“这是(笑脸1)和(笑脸2)”
,子匹配变量只显示笑脸1,笑脸2用括号保持不变;如“这是笑脸1和(笑脸2)”
。我无法用id
获取此DIV(smiley2)这包括方括号,因为id
没有方括号,但我需要方括号,因为这是一条带微笑的聊天消息,在方括号中。String#replace
可以通过regex进行替换,这正是您试图做的。使用g
标志使其成为一个全局regex,可以匹配多个内容。提供回调函数ion将允许您获得每场比赛的分组。有关更多信息,请参阅
var message=“这是(smiley1)和(smiley2)”;
var result=message.replace(/\(.*)\)/g,函数(match,p1){返回“”;});
console.log(result);
作为前传,我想说@Klaycon的答案将是我处理用例的首选方法。虽然我喜欢他们关于如何完成任务的答案,但它并没有解释问题中的代码为什么不起作用,或者如何修改(而不是替换)的原因下面是解决这个问题的一个尝试
解释 在不使用regex全局标志(即
g
)的情况下,.match()
将只提取第一个匹配的响应。因此,matches
变量是第一个匹配文本及其捕获组的数组。它看起来类似于以下内容(注意,它不包含任何smiley2内容):
有人可能会认为,您可以简单地将g
添加到您的正则表达式中,并获取所有捕获组,但JavaScript不是Perl(或其他可能允许的语言)。正则表达式引擎功能强大,但有限。相反,您必须使用matchAll()
方法。但是,即使这样,它也会受到限制,因为它返回的是一个iterable对象,而不是数组
因此,一旦您拥有该对象,您就可以从中创建一个数组(例如,使用array.from
),该数组将包含所有匹配的文本和捕获组。结果如下所示:
[ "(smiley1)", "smiley1" ]
从这里,您可以迭代matches数组,并使用replace()
函数。这就引出了下一点。replace()的第一个参数
可以是字符串或正则表达式。如果它是字符串(如您所称),它只会在遇到的第一个字符串时进行一次性替换。@klayton的答案使用带有全局“g”修饰符的正则表达式进行重复。如果您想使用字符串替换,您可以,只需要迭代新的matches数组并将其称为mult我去过几次
示例(数组)
let message=$(“textarea”).val();
设re=/\(.*?\)/g;//全局修饰符
让matches=Array.from(message.matchAll(re));//使用matchAll
matches.forEach(match=>{
让替换_文本=``
message=message.replace(匹配[0],替换文本)
})
console.log(消息)
这是(微笑1)和(微笑2)
非常感谢。
[ "(smiley1)", "smiley1" ]
[ ["(smiley1)","smiley1"],
["(smiley2)","smiley2"] ]