我需要从字符串中提取一组包含在两个分隔符之间的字符,而不返回分隔符本身。
一个简单的例子应该会有所帮助:
目标:提取方括号之间的子字符串,而不返回括号本身。
基本字符串:This is a test string [more or less]
如果我使用以下注册表。离。
\[.*?\]
匹配为[more or less]
。我只需要more or less
(没有括号)。
有可能吗?
答案 0 :(得分:362)
轻松完成:
(?<=\[)(.*?)(?=\])
从技术上讲,这是使用前瞻和外观。见Lookahead and Lookbehind Zero-Width Assertions。该模式包括:
或者你可以捕捉方括号之间的内容:
\[(.*?)\]
并返回第一个捕获的组而不是整个匹配。
答案 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个或更多不是[
的内容。创建这些匹配的组。
(?=\])
积极前瞻]
。匹配以]
结尾的组,而不将其包含在结果中。
完成。
[^\[]+(?=\])
证明。
与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)
答案 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