正则表达式以查找两个字符之间包含的字符串,同时排除定界符


294

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

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

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

基本字串This is a test string [more or less]

如果我使用以下规则。例如

\ [。*?\]

比赛是[more or less]。我只需要得到more or less(没有括号)。

有可能做到吗?


Answers:


452

容易完成:

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

从技术上讲,这是使用先行和后备。请参见零宽度断言的向前看和向后看。该模式包括:

  • 前面有一个[未捕获(向后看);
  • 一个非贪婪的捕获群体。停在第一个]是不贪心的;和
  • 后跟一个未捕获的](超前)。

另外,您也可以捕获方括号之间的内容:

\[(.*?)\]

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


137
“轻松完成”,哈哈!:)正则表达式总是让我头疼,一旦发现能解决我问题的表达式,我往往会忘记它们。关于您的解决方案:第一个按预期运行,第二个按预期运行,但包括括号。我正在使用C#,也许RegEx对象具有自己的正则表达式引擎“味道” ...
迭戈

4
这样做是因为您正在查看整个比赛,而不是第一个比赛的小组。
cletus

非常感谢,非常有用的网站!我将其作为参考。:)对不起,如果我感到困惑,C#开发并不是我真正的技能之一
迭戈

1
如果子字符串还包含定界符,这行得通吗?例如,This is a test string [more [or] less]这会返回more [or] less吗?
gnzlbg

1
@gnzlbg不,它将返回“更多[或”
MerickOWA

52

如果您使用的是JavaScript,那么cletus提供的第一个解决方案(?<=\[)(.*?)(?=\])将无法正常工作,因为JavaScript不支持后向运算符。

但是,第二个解决方案效果很好,但是您需要获取第二个匹配的元素。

例:

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"

2
如果字符串中[或多或少]有多个匹配项怎么办?


19

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

\[(.*?)\]

要捕获,请将其放在括号内。您不说这是使用哪种语言。例如,在Perl中,您可以使用$ 1变量来访问它。

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

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


谢谢,但是此解决方案不起作用,它一直包含方括号。正如我在对Cletus解决方案的评论中所写的那样,可能是C#RegEx对象以不同的方式解释它。我不是C#专家,所以这只是一个推测,也许就是我缺乏知识。:)
迭戈

11

[^\[] 匹配任何非[。

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

(?=\])积极向前]。匹配以结尾]但不包含在结果中的组。

做完了

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

证明。

http://regexr.com/3gobr

类似于null提出的解决方案。但是\]不需要额外的。作为附加的注释,这似乎\不需要逃脱[^。为了提高可读性,我将其保留。

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


8

PHP:

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


3

将正则表达式与bash脚本一起使用时,我遇到了同样的问题。我使用了带有grep -o的管道的两步解决方案

 '\[(.*?)\]'  

首先,然后

'\b.*\b'

显然,在其他答案上效率不高,而是一种替代方法。


3

此代码专门用于javascript的正则表达式解析器 /[^[\]]+(?=])/g

只需在控制台中运行

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

2

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

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

0

这是我在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

-1

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

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

结果:

hola mundo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.