为什么C#不跟我的正则表达式?

时间:2011-08-05 14:03:18

标签: c# regex

我有一个C#应用程序,它读取word文件并查找包含在<括号>

目前正在使用以下代码和正则表达式。

 private readonly Regex _regex = new Regex("([<])([^>]*)([>])", RegexOptions.Compiled);

我已经使用了几个在线测试工具/朋友来验证正则表达式的工作原理,我的应用证明了这一点(对于那些在家里玩的人来说,http://wordfiller.codeplex.com)!

然而,我的问题是正则表达式还会带来额外的垃圾。

E.G

I'm walking on <sunshine>.

将返回

sunshine>.

它应该返回

<sunshine>

任何人都知道我的申请拒绝遵守规则的原因吗?

6 个答案:

答案 0 :(得分:5)

我认为这个问题根本不是你的正则表达式。它可以稍微改进 - 你不需要每个括号周围的([]) - 但这不应该影响结果。 我强烈怀疑问题在于你的C#实现,而不是你的正则表达式。

您的正则表达式应将<sunshine>拆分为三个单独的组:<sunshine>。使用下面的代码测试它,这正是它的作用。我的怀疑是,在C#代码的某个地方,你将第3组追加到第2组而没有意识到。一些快速的C#实验支持这一点:

private readonly Regex _regex = new Regex("([<])([^>]*)([>])", RegexOptions.Compiled);
private string sunshine()
{
    string input = "I'm walking on <sunshine>.";
    var match = _regex.Match(input);
    var regex2 = new Regex("<[^>]*>", RegexOptions.Compiled); //A slightly simpler version

    string result = "";

    for (int i = 0; i < match.Groups.Count; i++)
    {
        result += string.Format("Group {0}: {1}\n", i, match.Groups[i].Value);
    }

    result += "\nWhat you're getting: " + match.Groups[2].Value + match.Groups[3].Value;
    result += "\nWhat you want: " + match.Groups[0].Value + " or " + match.Value;        
    result += "\nBut you don't need all those brackets and groups: " + regex2.Match(input).Value;

    return result;
}

结果:

Group 0: <sunshine>
Group 1: <
Group 2: sunshine
Group 3: >

What you're getting: sunshine>
What you want: <sunshine> or <sunshine> 
But you don't need all those brackets and groups: <sunshine> 

答案 1 :(得分:3)

我们需要查看更多代码来解决问题。您的代码中某处出现 off by one 错误。该正则表达式不可能返回sunshine>.。因此,正则表达式不是问题。我会假设,没有更多细节,有些东西正在将索引放入包含你的匹配的字符串中,而且它是字符串中的一个字符。

答案 2 :(得分:2)

如果你想要的只是&lt;之间的文字。和&gt;然后你最好使用:

 [<]([^>]*)[>] or simpler: <([^>]+)>

如果你想包括&lt;和&gt;然后你可以使用:

 ([<][^>]*[>]) or simpler: (<[^>]+>)

你的表达目前有3个组匹配 - 用括号()表示。

在&lt;阳光&GT;这将返回以下内容:

  

第1组:“&lt;”

     

第2组:“阳光”

     

第3组:“&gt;”

所以如果你只看第二组就应该有效!

我可以为您观察到的行为提供的唯一解释是,在您拉出比赛的地方,您将第2 + 3组加在第2组而不是第1组。

答案 3 :(得分:1)

你发布的内容完美无缺。

        Regex _regex = new Regex("([<])([^>]*)([>])", RegexOptions.Compiled);
        string test = "I'm walking on <sunshine>.";
        var match = _regex.Match(test);

匹配为<sunshine>我想您需要提供更多代码。

答案 4 :(得分:0)

默认情况下,正则表达式非常渴望。教它懒惰!

我的意思是,*运算符考虑尽可能多的重复(据说它很渴望)。使用 *?相反,这告诉Regex考虑尽可能少的重复(即懒惰):

<.*?>

答案 5 :(得分:-1)

因为您使用的是括号,所以您正在创建匹配的组。这导致匹配集合与正则表达式创建的组匹配也匹配。您可以将正则表达式缩减为[<][^>]*[>],它只会与&lt; text&gt;匹配。你想要的。