javascript正则表达式匹配模式(有冲突)

时间:2018-09-26 03:38:21

标签: javascript regex

假设以下字符串:

^[message] [site](http://example.com)

现在,我需要一个提取“ site”和“ http://example.com”的正则表达式。我想出了以下正则表达式:

/\[(.*?)\]\((.*?)\)/gm

但这不会从正则表达式结果中排除[message],返回message] [site而不是site

我尝试了其他几种可能的regex表达式,但只能使其正确。

有什么想法吗?

5 个答案:

答案 0 :(得分:0)

如果该空间始终存在:

/\s\[(.*?)\]\((.*?)\)/gm

答案 1 :(得分:0)

当试图匹配括号或括号中的内容时,请尝试查找不是结尾字符的任何字符([^\]][^)]),也可以找到*?替换为+

/\[([^\]]*?)\]\(([^)]*?)\)/gm

示例:Regex101

let str = '^[message] [site](http://example.com)'
let re = /\[([^\]]*?)\]\(([^)]*?)\)/gm

let matches = str.match(re)
console.log( RegExp.$1 )
console.log( RegExp.$2 )

答案 2 :(得分:0)

根据您的字符串并使用javascript,只要您始终提取组1,组2 ,但{strong>忽略组0 ...,\^\[.*?\]\s\[(.*)\]\((.*?)\)/gm就足够了。下面的代码;

// set up a test string with multiple matches
var text = "daska ^[message] [site](site.com) fjhdfgk fafug ^[message2] [site2](site2.com) fgsadkfgaskf akfkakf";

// collect all matching groups globally
// (this creates an array of full matches which we can water down next)
var results = text.match( /\^\[.*?\]\s\[(.*?)\]\((.*?)\)/gm );
// output: ["^[message] [site](site.com)", "^[message2] [site2](site2.com)"]

// use the full matches to extract the groups we want,
// and then fill an array of matches
results = results.map( function( result ) {
    var match = result.match( /\^\[.*?\]\s\[(.*?)\]\((.*?)\)/ );
    return [ match[1], match[2] ];
});
// output: [["site", "site.com"], ["site2", ["site2.com"]]

您应该能够使用输出数组执行所需的任何操作:)

答案 3 :(得分:0)

\[(.*?)\]\((.*?)\)将与第一个捕获组中的message] [site匹配,因为它将尝试至少匹配,直到可以匹配开头的括号为止。

相反,您可以使用2个capturing groups 首先匹配^[message],然后在匹配之后开始捕获组。

\^\[[^\]]+]\s+\[([^\]]+)\]\(([^)]+)\)

Regex demo

说明

  • \^匹配^
  • \[[^\]]+]使用否定的字符类匹配[]之间的内容
  • \s+匹配一个或多个空白字符
  • \[([^\]]+)\]使用否定的字符类(第1组)
  • 匹配捕获组中[]之间的内容
  • \(([^)]+)\)使用否定的字符类(第2组)
  • 匹配捕获组中()之间的内容

const regex = /\^\[[^\]]+]\s+\[([^\]]+)\]\(([^)]+)\)/;
const str = `^[message] [site](http://example.com)`;
let [, group1, group2] = str.match(regex);
console.log(group1);
console.log(group2);

答案 4 :(得分:-1)

您的正则表达式中的问题是:\[(.*?)\] 它与外部方括号[]中的所有内容都匹配,要解决此问题,您可以使用 [^[]*而非(.*?),因为较大的外部方括号[]包含[,因此包含^\[会将其排除在匹配范围之外。

/\[([^\[]*)\]\((.*?)\)/gm

try demo at regex 101