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

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

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

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

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

\[.*?\]

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

有可能做到吗?


当前回答

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

\[(.*?)\]

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

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

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

其他回答

下面是我在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

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

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

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

简单的完成:

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

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

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

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

\[(.*?)\]

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

去掉[]的用法:

\[.+\]

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

在控制台中运行即可

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