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)\["(.*)"\]
然后进行第二场比赛。