【问题标题】:Regex match quotes inside bracket regex正则表达式匹配括号内的引号正则表达式
【发布时间】:2015-03-19 12:30:21
【问题描述】:

我正在研究一个正则表达式,它必须只匹配引号内的文本而不是评论中的文本,我的 macthes 必须只匹配粗体字符串

“爱”;>

>/*“爱”*/

'爱'

“罗

更多的爱

已经“

我对此感到震惊:

/(?:((\"|\')(.|\n)*?(\"|\')))(?=(?:\/\**\*\/))/gm

第一个(?:((\"|\')(.|\n)*?(\"|\')))匹配所有字符串 第二个(?=(?:\/\**\*\/))/* "mystring" */ 内引号内的文本不匹配

我的逻辑显然是错误的

有什么建议吗?

谢谢

【问题讨论】:

  • 你能给我看一下吗?

标签: javascript regex


【解决方案1】:

也许您只需要使用否定前瞻来检查评论结尾*/

但首先,我将字符串分成单独的行

 var arrayOfLines = input_str.split(/\r?\n/);

或者,没有空行:

 var arrayOfLines = input_str.match(/[^\r\n]+/g);

然后使用this regex:

["']([^'"]+)["'](?!.*\*\/)

示例代码:

var rebuilt_string = ''
var re = /["']([^'"]+)["'](?!.*\*\/)/g; 
var subst = '<b>$1</b>'; 

for (i = 0; i < arrayOfLines.length; i++)
{
   rebuilt_string = rebuilt_string + arrayOfLines[i].replace(re, subst) + "\r\n";
}

【讨论】:

  • ("|')([^"']+)("|')(?!\*\/(.|\n)*\*\/) 我改变了一点正则表达式,但它仍然匹配评论中的字符串
  • 我宁愿先拆分多行输入,然后应用["']([^'"]+)["'](?!.*\*\/) 正则表达式。但是,C&H 为您提供了适合您的答案。
【解决方案2】:

避免注释部分的方法是先匹配它们。全局模式如下所示:

/(capture parts to avoid)|target/

然后使用回调函数进行替换(当捕获组存在时,原样返回匹配,否则,将匹配替换为你想要的。

例子:

var result = text.replace(/(\/\*[^*]*(?:\*+(?!\/)[^*]*)*\*\/)|"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*'/g,
    function (m, g1) {
        if (g1) return g1;
        return '<b>' + m + '</b>';
});

【讨论】:

  • 非常感谢正则表达式是完美的,我对正则表达式逻辑了解得更多。再次感谢
  • @Morticella:单引号没问题,刷新页面。
猜你喜欢
  • 2016-02-13
  • 2023-04-06
  • 1970-01-01
  • 2011-07-18
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多