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

时间:2009-09-21 14:52:35

标签: regex

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

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

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

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

如果我使用以下注册表。离。

\[.*?\]

匹配为[more or less]。我只需要more or less(没有括号)。

有可能吗?

13 个答案:

答案 0 :(得分:362)

轻松完成:

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

从技术上讲,这是使用前瞻和外观。见Lookahead and Lookbehind Zero-Width Assertions。该模式包括:

  • 前面有[未捕获(lookbehind);
  • 一个非贪婪的被捕集团。停在第一个位置是非贪心的;和
  • 后跟一个未被捕获的(前瞻)。

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

\[(.*?)\]

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

答案 1 :(得分:49)

如果您使用 JavaScript ,则cletus (?<=\[)(.*?)(?=\])提供的first solution将无效,因为JavaScript不支持lookbehind运算符。

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

示例:

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 :(得分:17)

你只需要'捕捉'括号之间的位。

\[(.*?)\]

要抓住你把它放在括号内。你没有说这是使用哪种语言。例如,在Perl中,您可以使用$ 1变量访问它。

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

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

答案 3 :(得分:8)

PHP:

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

答案 4 :(得分:6)

[^\[]匹配任何不是[。

+匹配1个或更多不是[的内容。创建这些匹配的组。

(?=\])积极前瞻]。匹配以]结尾的组,而不将其包含在结果中。

完成。

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

证明。

http://regexr.com/3gobr

与null提出的解决方案类似。但是不需要额外的\]。另外,在\之后,[似乎无需转义^。为了便于阅读,我会把它留在。

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

答案 5 :(得分:4)

最新解决方案

如果您使用的是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' ]

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

答案 6 :(得分:4)

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

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

这里用于查找 XY 之间的字符串。 Rubular 示例 here,或查看图片:

enter image description here

答案 7 :(得分:3)

要删除[]使用:

\[.+\]

答案 8 :(得分:3)

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

只需在控制台中运行

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

答案 9 :(得分:2)

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

 '\[(.*?)\]'  

首先,然后

'\b.*\b'

显然在其他答案上效率不高,但另一种选择。

答案 10 :(得分:0)

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

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

答案 11 :(得分: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

答案 12 :(得分:-1)

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

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

结果:

hola mundo