我需要从字符串中提取包含在两个分隔符之间的一组字符,而不返回分隔符本身。

一个简单的例子应该会有所帮助:

目标:提取方括号之间的子字符串,不返回方括号本身。

基本字符串:这是一个测试字符串[或多或少]

如果我使用下面的reg。前女友。

\[.*?\]

比赛[差不多]进行得很顺利。我只需要得到更多或更少(没有括号)。

有可能做到吗?


当前回答

去掉[]的用法:

\[.+\]

其他回答

下面是一个带有明显分隔符(X和Y)的一般示例:

(?<=X)(.*?)(?=Y)

在这里,它用于查找X和y之间的字符串。

如果使用JavaScript, cletus提供的解决方案(?<=\[)(.*?)(?=\])将不起作用,因为JavaScript不支持向后查找操作符。

编辑:实际上,现在(ES2018)可以使用向后查找操作符。只需要添加/来定义正则表达式字符串,就像这样:

var regex = /(?<=\[)(.*?)(?=\])/;

旧的回答:

解决方案:

var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);

它将返回:

["[more or less]", "more or less"]

你需要的是第二个值。使用:

var matched = regex.exec(strToMatch)[1];

返回:

"more or less"

简单的完成:

(?<=\[)(.*?)(?=\])

从技术上讲,这是使用瞭望头和后视头。参见前向和后向零宽度断言。该模式包括:

前面有a[未捕获的(向后看); 一个非贪婪的捕获组。停在第一个是不贪婪的];而且 后面跟着一个没有被捕获的[](超前)。

或者你也可以捕获方括号之间的内容:

\[(.*?)\]

并返回第一个捕获的组而不是整个匹配。

[^\[]匹配任何不是[的字符。

+匹配1个或更多不是[的东西。创建这些匹配项的组。

(?=\])正面展望]。匹配以]结尾的组,但不将其包含在结果中。

完成了。

[^\[]+(?=\])

证明。

http://regexr.com/3gobr

类似于由null提出的解决方案。但额外的\]是不需要的。另外需要注意的是,\似乎不需要转义^后面的[。为了可读性,我会保留它。

在分隔符相同的情况下不起作用。例如“more or less”。

最新解决方案

如果你使用Javascript,我想出的最好的解决方案是使用match而不是exec方法。 然后,使用$1迭代匹配并删除带有第一组结果的分隔符

const text = "This is a test string [more or less], [more] and [less]";
const regex = /\[(.*?)\]/gi;
const resultMatchGroup = text.match(regex); // [ '[more or less]', '[more]', '[less]' ]
const desiredRes = resultMatchGroup.map(match => match.replace(regex, "$1"))
console.log("desiredRes", desiredRes); // [ 'more or less', 'more', 'less' ]

如您所见,这对于文本中的多个分隔符也很有用