【问题标题】:Regex that matches everything before an underscore匹配下划线前所有内容的正则表达式
【发布时间】:2011-05-25 17:32:25
【问题描述】:

我有相当多的 RegEx 知识,但我被这一点难住了。我需要一个正则表达式,它匹配最后一个下划线之前的所有内容,但如果下划线之后的文本是“self”、“ally”或“enemy”。

所以如果我有这样的输入字符串:

"hero_anti_infantry_melee_2_self"
"anti_infantry_ranged_2_ally"
"suppression_aoe_enemy"
"reinforce_btn_down"
"inset_energy"
"suppressed"

我希望它们输出为:

"hero_anti_infantry_melee_2"
"anti_infantry_ranged_2"
"suppression_aoe"
//No Match (not match because it isn't enemy, ally, or self after the underscore)
//No Match
//No Match (not underscores or enemy/ally/self

这是使用 C# RegEx 引擎,它可以使用任何必要的 RegEx 选项。

【问题讨论】:

    标签: c# .net regex c#-4.0


    【解决方案1】:

    您想要的是前瞻。这样的事情应该可以工作:

    new Regex(@"^.*(?=_(ally|self|enemy)$)")
    

    (?=...) 表示pretty much what you wanted

    零宽度正向预测。匹配前瞻内的模式可以匹配的位置。仅匹配位置。它不消耗任何字符或扩展匹配。在 one(?=two)three 这样的模式中,2 和 3 都必须匹配到 one 的匹配结束的位置。

    编辑:MSDN 对此有 better examples

    【讨论】:

    • 也意识到我给出了错误的例子。我不确定这是否会影响这一点,因为这个正则表达式似乎不起作用。
    • 我在正则表达式中有错字 - )$ 而不是 $)。我还将它更改为 C# 语法 - 这次实际上检查了它是否有效。
    • 完美运行。而且我认为使用前瞻是最有意义的。 +1
    【解决方案2】:

    /(.+)_(盟友|自己|敌人)/

    【讨论】:

    • 我测试过,看起来模式在下划线后面包含了敌人\盟友\自己。我宁愿它匹配最后一个下划线,但前提是它后面的字母是敌人\盟友\自我(参见前 3 个示例)。前后的斜线是什么意思?
    • 那是 php/perl 语法,您只需要检查第一次捕获的匹配项即可。 (.+_)(盟友|自己|敌人)
    【解决方案3】:

    这种方法会给你想要的结果。这使用命名组正则表达式匹配。

     private static string GetStringBeforeUnderscore(string input)
     {
         string matchedValue = 
             Regex.Match(input, "(?<Group>.*)[_](self|ally|enemy)").Groups["Group"].ToString();
    
         return matchedValue;
     }
    

    【讨论】:

      【解决方案4】:

      我还不能评论 Macy Abbey 的另一个答案,所以就这样吧:

      如果只想匹配末尾的单词,则需要在搜索字符串的末尾附加一个“$”:

      /(.+)_(ally|self|enemy)$/
      

      【讨论】:

        【解决方案5】:

        这行得通

        static void Main(string[] args)
                {
                    string [] vars=
               new string[]{ @"data\ui\textures\generic\decorators\hero_anti_infantry_melee_2_self",
        @"data\ui\textures\generic\decorators\anti_infantry_ranged_2_ally",
        @"data\ui\textures\generic\decorators\suppression_aoe_enemy",
        @"data\ui\textures\generic\decorators\reinforce_btn_down",
        @"data\ui\textures\generic\decorators\rinset_energy",
        @"data\ui\textures\generic\decorators\suppressed" };
        
         Regex re = new Regex("^(.*)_(ally|self|enemy)");
        
        var xx= vars.Select(x => re.Match(x).Groups[1]);
        foreach (var y in xx)
            Console.WriteLine(y.Value.ToString());
                }
            }
        

        【讨论】:

        • 毫无疑问,它确实有效,但在这种情况下,我只需要第一个匹配项即可成为结果,无论分组如何。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 2014-05-03
        • 2011-04-13
        • 1970-01-01
        相关资源
        最近更新 更多