正则表达式查找包含在两个字符之间的字符串,同时排除分隔符

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

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

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

基础字符串: This is a test string [more or less]

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

\[.*?\]

The match is [more or less]. I need to get only more or less (without the brackets).

Is it possible to do it?

773121 次浏览

简单的完成:

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

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

  • 之前有一个未被捕获的[(向后查找);
  • 一个非贪婪的捕获组。止于第一个]是非贪婪的;而且
  • 后面跟着一个未被捕获的](超前)。

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

\[(.*?)\]

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

您只需要“捕获”括号之间的位。

\[(.*?)\]

为了捕获,你把它放在括号里。你没有说它使用的是哪种语言。例如,在Perl中,您可以使用$1变量来访问它。

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

其他语言将有不同的机制。例如,我相信c#使用匹配集合类。

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);

去掉[]的用法:

\[.+\]

如果需要提取不带括号的文本,可以使用bash awk

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

结果:

hola mundo

我有同样的问题使用正则表达式与bash脚本。 我使用了一个2步解决方案,使用grep -o管道应用

 '\[(.*?)\]'

首先,然后

'\b.*\b'

显然在其他答案上没有那么有效,但这是另一种选择。

如果你正在使用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"

这个特别适用于javascript的正则表达式解析器/[^[\]]+(?=])/g

在控制台中运行即可

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

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

+匹配非[的任意1个或多个。创建这些匹配项的组。

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

完成了。

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

证明。

http://regexr.com/3gobr

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

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

我想在/和#之间找到一个字符串,但#有时是可选的。下面是我使用的正则表达式:

  (?<=\/)([^#]+)(?=#*)

以下是我在c#中没有'['']'的情况:

var text = "This is a test string [more or less]";


// Getting only string between '[' and ']'
Regex regex = new Regex(@"\[(.+?)\]");
var matchGroups = regex.Matches(text);


for (int i = 0; i < matchGroups.Count; i++)
{
Console.WriteLine(matchGroups[i].Groups[1]);
}

输出结果为:

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' ]

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

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

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

在这里,它用于查找XY之间的字符串。Rubular的例子在这里,或者参见image:

enter image description here