我需要从字符串中提取的一组都包括两个分隔符,而不会返回自己的分隔符之间的字符。

一个简单的例子应该是有帮助的︰

目标︰ 提取方括号,但不包括支架本身之间的子字符串。

基于字符串这是一个测试字符串 [更多或更少]

如果我使用 ex 下的登记。

[.*?]

[更多或更少]是匹配。我需要获取只能更多或更少(不带括号)。

是否可以呢?

2009-09-21 14:52:34
问题评论:

回答:

轻松完成︰

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

从技术上讲,根据预测先行和追溯。请参阅预测先行和回顾后发零宽度断言该模式包括︰

  • 前面是 [即不捕获 (回顾);
  • 非贪婪的捕获的组。它是对非贪婪首先停止];
  • 后跟] 即不捕获 (预测先行)。

也可以只是捕获方括号之间是什么︰

[(.*?)]

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

"轻松完成",LOL !:)正则表达式总是给我麻烦,我倾向于忘记它们,只要我找到解决我的问题。有关您的解决方案︰ 第一按预期方式工作,第二个没有,它将保留包括括号。我使用 C#,RegEx 对象可能有它自己"然后再将其"正则表达式引擎的...

它正在执行的操作,因为要看整个匹配项,而不是第一个匹配的组。

许多感谢您,非常有用的网站 !我将保持它作为参考。:)抱歉如果我进行了一些混乱,C# 开发不是真正的我的技能之一.

这一点如果子还包含分隔符呢?例如在This is a test string [more [or] less]将此返回more [or] less ?

@gnzlbg 没有,它将返回"更多 [或"

您只需要捕获括号间位。

[(.*?)]

要捕获您将其放在括号内。不,不要说它使用的哪种语言。在 Perl 中,访问此使用的变量 $1。

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

其他语言将具有不同的机制。C#,例如,使用匹配集合类,我认为。

谢谢,但本解决方案不起作用,它使包括方括号。因为我写了我的注释到 Cletus 的解决方案中,则可能是,C# RegEx 对象会将它解释以不同的方式。我不专家 C# 也是如此,所以只是假设,也许是只需我缺乏知识。:)

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

经典的技巧 dude

PHP:

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

若要删除还 [] 使用︰

[.+]
请输入您的翻译

Regular Expression to find a string included between two characters while EXCLUDING the delimiters

确认取消