假设以下字符串:
^[message] [site](http://example.com)
现在,我需要一个提取“ site”和“ http://example.com”的正则表达式。我想出了以下正则表达式:
/\[(.*?)\]\((.*?)\)/gm
但这不会从正则表达式结果中排除[message]
,返回message] [site
而不是site
。
我尝试了其他几种可能的regex表达式,但只能使其正确。
有什么想法吗?
答案 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+\[([^\]]+)\]\(([^)]+)\)
说明
\^
匹配^
\[[^\]]+]
使用否定的字符类匹配[]
之间的内容\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