【问题标题】:Regex for delimited string not working C# [duplicate]用于分隔字符串的正则表达式不起作用 C# [重复]
【发布时间】:2016-06-18 22:53:37
【问题描述】:

我想要,给定一个网页来提取每个出现的分隔字符串。我使用正则表达式来实现这一点,就像这样

Regex Rx = new Regex(before + "(.*?)" + after);

if (o is string)
{
    string s = o as string;
    List<string> results = new List<string>();
    foreach (Match match in Rx.Matches(s))
    {
        results.Add(match.ToString().Replace(before, "").Replace(after, ""));
    }
    return results.ToArray();
}

我的输入是包含此文本的 html 字符串

<script type="text/javascript">
            var s1 = new SWFObject("http://hornbunny.com/player.swf","ply","610","480","10","#000000");
            s1.addParam("allowfullscreen","true");
            s1.addParam("allowscriptaccess","always");
                            s1.addParam("flashvars","overlay=http://cdn1.image.somesite.com/thumbs/0/9/e/1/2/09e12f7aeec382bc63a620622ff535b6/09e12f7aeec382bc63a620622ff535b6.flv-3b.jpg&settings=http://somesite.com/playerConfig.php?09e12f7aeec382bc63a620622ff535b6.flv|0");
            s1.write("myAlternativeContent");
        </script>

我得到的结果是包含 0 个元素的字符串 [],因为 foreach (Match match in Rx.Matches(s)) 循环了 0 次。

但它恰好匹配 0 次,尽管我的文档中至少出现了 1 次。 我试图提取var s1 = new SWFObject&lt;/script&gt; 之间的字符串作为分隔符,所以没有特殊字符,即使我没有转义我的字符串。

那个正则表达式似乎有什么问题?

工作:

 if (o is string)
            {
                string s = o as string;
                List<string> results = new List<string>();
                foreach (Match match in Rx.Matches(s))
                {
                    results.Add(match.Groups[1].Value);
                }
                return results.ToArray();
            }

【问题讨论】:

  • 您需要在beforeafter 中提供您的内容,并举例说明...*? 本质上是懒惰的..它会在终止之前尽可能少地消耗..所以它是很高兴匹配 0 个字符
  • 好吧,没有问号?但我希望正则表达式是懒惰的,所以它可以得到尽可能小的匹配,我不想在匹配中找到我的分隔符
  • 如果您的字符串包含换行符,请使用RegexOptions.Singleline
  • @JDE 你需要提供一个例子
  • 你的输入输出

标签: c# regex


【解决方案1】:

.*? 匹配任何字符除了换行符 没有RegexOptions.Singleline 选项。因此,除非它全部在一行上,否则它不会匹配换行符分隔符。

所以我们到达((.|\s)*) = 匹配 0 到无限次之间的任何字符或换行符。 或者如果我们使用RegexOptions.Singleline,我们可以将正则表达式简化为(.*)

编辑:工作示例。

var before = "var s1 = new SWFObject";
var after = "</script>";
var о = @"var s1 = new SWFObject(d
aw
da
wd
awd
aw
d
aw
d
awd
        </script> ";
Regex Rx = new Regex(before + "(.*)" + after,RegexOptions.Singleline);


if (о is string)
{
    string s = о as string;
    List<string> results = new List<string>();
    foreach (Match match in Rx.Matches(s))
    {
        results.Add(match.Groups[1].Value);
    }
      results.ToArray().Dump();
}

【讨论】:

  • / 不是正则表达式元字符,无需转义。
  • 那个,加上我用 Regex.Escape() 修复了这个问题,当然仍然不能正常工作
  • 我相信你是对的。但是在 PHP 正则表达式中 / 是一个特殊字符。我知道这是 .net 正则表达式。所以是的....这种情况没用,我想我只是习惯于逃避/ ref:php.net/manual/en/regexp.reference.delimiters.php
  • 在 PHP 中,你可以选择你想要的分隔符。如果您选择 / 以外的任何其他内容(比如常见的选择 #),则无需转义 /
  • 为什么不使用(?s)
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
相关资源
最近更新 更多