正则表达式分裂"&"在URL参数中,只有当它们后跟以" ="结尾的内容时

时间:2016-02-22 18:42:21

标签: c# regex

我一直在尝试使用格式错误的网址来解决这个问题,其中特定参数的值可能包含可能与解析网址冲突的特定字符。

if( remaining.Contains( "?" ) || remaining.Contains( "#" ) )
{
    if( remaining.Contains( "?" ) )
    {

        Path = remaining.Substring( 0, temp = remaining.IndexOf( "?" ) );

        remaining = remaining.Substring( temp + 1 );

        // Re-encode for URLs
        if( remaining.Contains( "?" ) )
        {
            remaining = URL.Substring( URL.IndexOf( "?" ) + 1 );
        }

        if( remaining.IndexOf("=") >= 0 )
        {
            string[] qsps = Regex.Split( remaining, @"[&]\b" );// Original Method: remaining.Split( '&' );
            qsps.ToList().ForEach( qsp =>
            {
                string[] vals = qsp.Split( '=' );
                if( vals.Length == 2 )
                {
                    Parameters.Add( vals[0], vals[1] );
                }
                else
                {
                    string key = (string) vals[0].Clone();
                    vals[0] = "";
                    Parameters.Add( key, String.Join( "=", vals ).Substring( 1 ) );
                }
            } );
        }
}

我添加了行" Regex.Split(剩余,@" [&] \ b"); "抓住"&"后面跟着一个角色,看起来很有用。

我只是想看看是否有更好的方法只能拆分"&'"实际上是参数吗?

要测试的示例(导致此需要更新):

  

www.myURL.com/shop/product?utm_src=bm23&utm_med=email&utm_term=apparel&utm_content=02/15/2016&utm_campaign=Last   机会!总统'日销售活动:免费送货&更!

正在运行的正则表达式只能抓取以下内容:

  • utm_src = btm23
  • utm_med =电子邮件
  • utm_term =服饰
  • 的utm_content = 02 /二千零十六分之十五
  • utm_campaign =最后一次机会!总统'日销售活动:免费送货&更多!

它不应该计算"&更"作为匹配,因为该部分不以" ="结束。之后

4 个答案:

答案 0 :(得分:1)

我想使用这个正则表达式:

Regex.Split(url, @"(?<=(?:=\S+?))&", 
   RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

如果您通过url传递测试字符串,那就是。

www.myURL.com/shop/product?utm_src=bm23&utm_med=email&utm_term=apparel&utm_content=02/15/2016&utm_campaign=Last Chance! Presidents' Day Sales Event: Free Shipping & More!

输出应为。

www.myURL.com/shop/product?utm_src=bm23
utm_med=email
utm_term=apparel
utm_content=02/15/2016
utm_campaign=Last Chance! Presidents' Day Sales Event: Free Shipping & More!

请注意第一行输出。

www.myURL.com/shop/product?utm_src=bm23

包含网址的第一个路径,但可以通过?

轻松拆分

答案 1 :(得分:1)

我建议使用前瞻的正则表达式:

/&(?=[^&=]+=)/

您可以在此处看到此效果:version1。它首先查找&字符,然后向前“查看”以确保跟随=,但前提是它不包含其他&=之间。

您还可以确保没有任何空格字符(如换行符等)在网址中无效(version 2):

&(?=[^\s&=]+=)

答案 2 :(得分:1)

(?<=[?&])([^&]*)(?=.*[&=])

<强>解释

  • (?<=[?&])对于&#39;&amp;&#39;或者&#39;?&#39;
  • ([^&]*)捕获尽可能多的字符,但不是&#39;&#39;
  • (?=.*[&=])对于&#39;&amp;&#39;的积极前瞻或&#39; =&#39;

<强>输出:

  • utm_src = bm23
  • utm_med =电子邮件
  • utm_term =服饰
  • 的utm_content = 02 /二千零十六分之十五
  • utm_campaign =最后一次机会!总统&#39;日销售活动:免费送货

Demo

所以要获得比赛:

string str = "www.myURL.com/...";
Regex reg = "(?<=[?&])([^&]*)(?=.*[&=])";
List<string> result = reg.Matches(str).Cast<Match>().Select(m => m.Value).ToList();

编辑问题编辑

(?<=[?&])\S.*?(?=&\S)|(?<=[?&])\S.*(?=\s)

答案 3 :(得分:1)

不确定你要做什么,但如果你想找到错误的 &符号,这是一个很好的正则表达式。

&(?=[^&=]*(?:&|$))

您可以替换为%26或与之分开。
如果你用它分裂,只需重新组合,错误的&符号就会消失。