JavaScript - 替换字符串中的方括号

时间:2016-03-16 20:41:47

标签: javascript regex replace

我有一个简单的字符串,并尝试将 [~sample] 转换为 @sample 。例如:

var string = 'Completely engineer client-based strategic [~theme] areas before cross [~media] technology';
string.replace('[~', '@');

我已经尝试过以上解决方案,但它只转换第一个并且]无法删除。

现在我学会了如何使用/ g

6 个答案:

答案 0 :(得分:3)

试试这段代码:

string.replace(/(\[~)(\w+)(\])/g, function(match, p1, p2, p3) {
  // p1 = [~
  // p2 = theme / media / whateverWord
  // p3 = ]
  return '@' + p2
  // Returns @whateverWord
})

1st群组中:

  • \[会选择[
  • ~会选择〜

2nd群组中:

  • \w会选择任何字母数字字符或_
  • +表示字母数字字符必须至少出现一次,即1[~
  • 之间必须至少有]个字母

3rd群组中:

  • \]会选择任何]

在功能中:

  • match未在输出中使用,但它包含整个匹配的子字符串
  • p1包含[~
  • p2包含[~]之间的字词,即thememedia
  • p3包含]

return声明return@,后跟[~]

之间的字词

这会将所有[~替换为@

这是一个有效的例子:



var string = 'Completely engineer client-based strategic [~theme] areas before cross [~media] technology. Also, [this tag] [will be kept]'

document.body.innerHTML = string.replace(/(\[~)(\w+)(\])/g, function(match, p1, p2, p3) {
  return '@' + p2
})




编辑:实际上,您可以更简单:

string.replace(/(\[~)(\w+)(\])/g, '@$2')

查看下面的演示:



var string = 'Completely engineer client-based strategic [~theme] areas before cross [~media] technology. Also, [this tag] [will be kept]'

document.body.innerHTML = string.replace(/(\[~)(\w+)(\])/g, '@$2')




$2包含第二个捕获组的内容,第二个捕获组包含[~]之间的文本。因此输出为@,后跟文本。

这比上面的版本更简单,更快,占用的空间更少

答案 1 :(得分:3)

您可以使用RegExp /(\[~)|(\])/g



var string = 'Completely engineer client-based strategic [~theme] areas before cross [~media] technology';

var res = string.replace(/(\[~)|(\])/g, function(match, p1, p2) {
  if (p1) return "@";
  if (p2) return ""
});

document.body.textContent = res;




答案 2 :(得分:2)

这个问题比简单地嵌套.replace [@]

更复杂一些



var string = 'Strategic [~theme] areas with cross [~media] technology [this is fine] ok?';

document.body.innerHTML = string.replace(/\[~([^\]]+)\]/g, '@$1');




([^\]]+)确保捕获任何不是]但由[~]分隔的字符,这在任何情况下都会阻止文字像[don't mess with me]一样......被搞砸了。

详细解释了RegExp here

答案 3 :(得分:1)

"Completely engineer client-based strategic [~theme] areas before cross [~media] technology [with some] other bits.".replace(/\[~([^\]]+)\]/g,"@$1");

您需要在搜索中限定代字号。我对所有疯狂的投票感到惊讶。人们试图在这里提供帮助。如果有人对帖子和答案有疑问,那么解释一下你为什么要投票而不仅仅是在不对自己进行解释的情况下肆无忌惮地投票更有帮助。

正如其他人所说,谷歌是朋友。尝试在www.regular-expressions.info上搜索以获得更多帮助。

答案 4 :(得分:1)

以下代码使用Regexp查找以 [〜开头并以] 结尾的所有序列组。它还捕获了两者之间的单词。 替换函数的第二个参数中的 $ 1 引用找到的单词。



var string = 'Completely engineer client-based strategic [~theme] areas before cross [~media] technology'


document.body.innerHTML = string.replace(/\[~(\w+)\]/g, '@$1');




答案 5 :(得分:0)

我认为这就是你要找的https://jsfiddle.net/DIRTY_SMITH/7oe5kh9L/33/

string.replace(/\[~/g, '@').replace(/\]/g, '');

var string = 'Completely engineer client-based strategic [~theme] areas before cross [~media] technology';
alert("Starting string:" +string);

var res = string.replace(/\[~/g, '@').replace(/\]/g, '');
alert("Final string: "+res)