5

我正在尝试以以下模式提取所有文本(显示为 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 :))

4

3 回答 3

7

对您的代码进行一些小的修改。

string patternstart = Regex.Escape("Session[");
string patternend = Regex.Escape("]");
string regexexpr = patternstart + @"(.*?)" + patternend;
于 2013-09-03T21:58:27.143 回答
1

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

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

一个示例“最终字符串”可以是:

Session\["(.*)"\]

但是,如果需要,您可以轻松编写 RegEx 来自动处理 Session、Querystring 等(无需匹配您扔给它的所有其他数组),并避免首先构建字符串:

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

然后参加第二场比赛。

于 2013-09-03T21:57:20.753 回答
1

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

\\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"
于 2013-09-03T21:58:43.730 回答