首页 > 解决方案 > 括号匹配的正则表达式

问题描述

/(?:^|[^\/\\])\[([\w\s-]*)($|\[)/当用户开始输入字符并输入 [some tex, 以匹配此内容时,我使用当前正则表达式进行匹配。当他关闭时,比赛就停止了。

问题是我在前面添加了条件,?:如果他输入\[or /[,我不会匹配它。

好吧,但是,如果他有类似的东西[text][bla- 在这个我将匹配前一个]括号并且字符串将是][bla,但我不想要这个。如果他进入[test] [car- 这将匹配前面的空间并且将是_[car-_是空间。

我希望两者都只匹配从左括号到,而不是在它之前。各位有什么想法吗。谢谢!

标签: javascriptregex

解决方案


我并不完全清楚,但如果我理解正确,您想检测成对的[]尖括号,但跳过/\转义尖括号,如\]and /],对吗?

[aaa]一对、[bbb/[ccc/]ddd]另一对和另一对也是如此[eee\[fff\]ggg]

以下是如何使用三个正则表达式解析它:

var str = 'Test [1st], and [2nd\\[with\\]escapes], and [3nd/[more/]escapes][4thNoSpace] text';
var re = /(\[[^\]]*\])/g;
var result = str
.replace(/([\\\/])\]/g, '$1\x01') // replace escapes with tokens
.replace(re, function(m, p1) {    // process bracket pairs
  return '<b>' + p1 + '</b>';
})
.replace(/(.)\x01/g, '$1\]');     // restore escapes from tokens

console.log('before: ' + str);
console.log('result: ' + result);
document.body.insertAdjacentHTML('beforeend', result);

所以,这个输入:
Test [1st], and [2nd\[with\]escapes], and [3nd/[more/]escapes][4thNoSpace] text

...产生这个输出:
Test <b>[1st]</b>, and <b>[2nd\[with\]escapes]</b>, and <b>[3nd/[more/]escapes]</b><b>[4thNoSpace]</b> text

解释:

  • 测试输入字符串有 4 个尖括号对,其中两个有转义括号,一个跟在另一个后面没有空格
  • 第一个正则表达式用临时标记替换转义的尖括号,这样第二个正则表达式就不会越过转义的尖括号
  • 第二个正则表达式识别正确的尖括号对
  • 第三个正则表达式将标记恢复到转义的尖括号
  • 生成的文本在尖括号对周围添加粗体标签以指示正确解析

将来,指定示例输入字符串以及每个输入的预期输出会很有帮助。


推荐阅读