2个字符串之间的文本的正则表达式模式

我试图在以下模式中提取所有文本(显示为xxxx):

Session["xxxx"] 

使用c#

这可能是Request.Querystring["xxxx"]所以我试图动态构建表达式。 当我这样做,我得到各种关于未转义的字符或没有匹配的问题:(

一个例子可能是:

 string patternstart = "Session["; string patternend = "]"; string regexexpr = @"\\" + patternstart + @"(.*?)\\" + patternend ; string sText = "Text to be searched containing Session[\"xxxx\"] the result would be xxxx"; MatchCollection matches = Regex.Matches(sText, @regexexpr); 

我可以帮助解决这个问题(因为我似乎总是使用RegEx :))

对代码进行一些修改。

 string patternstart = Regex.Escape("Session["); string patternend = Regex.Escape("]"); string regexexpr = patternstart + @"(.*?)" + patternend; 

您在示例中构建的模式如下所示:

 \\Session[(.*?)\\] 

这有几个问题。 首先,它假定字符串以字面反斜杠开头,其次,它将整个(.*?)包装在字符类中,这意味着它将匹配任何单个左括号,句点,星号,问号,右括号或反斜杠。 如果要匹配文字[ 。],则需要转义模式中的括号。

你可以使用这样的模式:

 Session\[(.*?)] 

例如:

 string regexexpr = @"Session\[(.*?)]"; string sText = "Text to be searched containing Session[\"xxxx\"] the result would be xxxx"; MatchCollection matches = Regex.Matches(sText, @regexexpr); Console.WriteLine(matches[0].Groups[1].Value); // "xxxx" 

字符[]与正则表达式具有特殊含义 – 它们定义了一个包含字符之一必须匹配的组。 要解决这个问题,只需使用前导\字符“转义”它们:

 string patternstart = "Session\["; string patternend = "\]"; 

然后,示例“最终字符串”可以是:

 Session\["(.*)"\] 

但是,如果需要,您可以轻松地编写RegEx以自动处理Session,Querystring等(不会匹配您抛出的所有其他数组),并且避免必须首先构建字符串:

 (Querystring|Session|Form)\["(.*)"\] 

然后进行第二场比赛。