如何在正则表达式中找到两个其他字符串之间的字符串?

时间:2009-11-26 10:28:46

标签: .net regex

或多或少显而易见:

\[start\](.*?)\[end\]

但是也会产生[start]和[end]标签。你怎么省略它们?

例如:f("[somestartstring]result[someendstring]") == "result"

更新:建议的答案无效。我的代码是:

printfn "%s" (Regex.Match(@"[start]result[end]",
                          "\\[start\\](.*?)\\[end\\]").Groups.[0].Value)

但它仍会产生周围的开始和结束标记。

我的错误是:0指数!谢谢。

4 个答案:

答案 0 :(得分:5)

您需要使用一个组,这是一个匹配的字符串:

\[start\](.*?)\[end\]

当你来阅读时,它们从1开始编号(零是整个匹配的字符串)。 (如果您发现更直观的话,还有指定组的工具。)

E.g。在C#中:

Match match = new Regex("\[start\](.*?)\[end\]").Match("[start]blah[end]");
string value = match.Groups[1].Value;

答案 1 :(得分:3)

记住Groups[0]匹配整个输入。如果您只想要第一个捕获的组,那么它是Groups[1],所以

string text = "[start]blahblah[end]";
Console.WriteLine(Regex.Match(text, @"\[start\](.*?)\[end\]").Groups[1].Value);

打印blahblah

答案 2 :(得分:1)

使用\[start\](.*?)\[end\]

C#

Regex regex = new Regex("\\[start\\](.*?)\\[end\\]");

VB

Dim regex As Regex = New Regex("\[start\](.*?)\[end\]")

答案 3 :(得分:0)

取决于语言。通常您必须指定要返回的匹配组;通常,组为零是整个匹配表达式,1是第一个匹配组,2是第二个匹配组,依此类推。

更新1 :请参阅http://www.regular-expressions.info/dotnet.html

Update 2 :作者似乎认为他理解.NET语法。因此,删除代码示例并让答案独立。