为什么c#不遵循我的正则表达式?

本文关键字:我的 正则表达式 为什么 | 更新日期: 2023-09-27 18:04:32

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

当前正在使用以下代码和显示的正则表达式。

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

我已经使用了几个在线测试工具/朋友来验证regex工作,我的应用程序证明了这一点(对于那些在家里玩,http://wordfiller.codeplex.com)!

我的问题是,然而,正则表达式也会拾取额外的垃圾。

E。G

I'm walking on <sunshine>.

将返回

sunshine>.

它应该返回

<sunshine>
有谁知道为什么我的应用程序拒绝按规则玩吗?

为什么c#不遵循我的正则表达式?

我不认为问题出在你的正则表达式。它可以有所改进——您不需要在每个括号周围加上([])——但这不应该影响结果。我强烈怀疑问题出在你的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> 

我们需要看到更多的代码来解决这个问题。在您的代码中有一个被一个错误断开。该正则表达式不可能返回sunshine>.。因此,正则表达式不是问题所在。我假设,不需要更多的细节,某些东西正在将索引放入包含您的匹配的字符串中,并且它在字符串中超出了一个字符。

如果你想要的只是<和比;那么你最好使用:>

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

如果你想包含<和比;然后你可以使用:>

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

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

这将返回以下内容:

第一组:"<&quot;

第二组:"sunshine&;

第三组:">"

所以如果你只看第二组,它应该工作!

我能给你观察到的行为的唯一解释是,你把比赛拉出来的地方,你加在一起组2 + 3,而不是组1。

你张贴的效果很好。

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

匹配<sunshine>,我猜你需要提供更多的代码。

Regex在默认情况下是渴望的。教它变懒!

我的意思是,*运算符考虑尽可能多的重复(它被称为渴望)。使用*?操作符,它告诉Regex考虑尽可能少的重复(即懒惰):

<.*?>

因为使用了括号,所以创建的是匹配组。这将导致匹配集合匹配由正则表达式创建的组。您可以将正则表达式简化为[<][^>]*[>],它将只匹配