我试图在以下模式中提取所有文本(显示为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 :) :)
答案 0 :(得分:7)
对您的代码进行一些修改。
string patternstart = Regex.Escape("Session[");
string patternend = Regex.Escape("]");
string regexexpr = patternstart + @"(.*?)" + patternend;
答案 1 :(得分:1)
字符[
和]
与正则表达式具有特殊含义 - 它们定义了一个包含其中一个字符必须匹配的组。要解决这个问题,只需使用前导\字符“转义”它们:
string patternstart = "Session\[";
string patternend = "\]";
示例“最终字符串”可以是:
Session\["(.*)"\]
但是,如果需要,您可以轻松编写RegEx以自动处理Session,Querystring等(不会同时匹配所有其他数组),并且避免必须首先构建字符串:
(Querystring|Session|Form)\["(.*)"\]
然后进行第二场比赛。
答案 2 :(得分: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"