在下划线之前匹配所有内容的正则表达式

时间:2010-12-15 05:57:47

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

我有一点RegEx的知识,但我对这个感到难过。我需要一个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选项。

5 个答案:

答案 0 :(得分:5)

你想要的是一个先行者。这样的事情应该有效:

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

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

  

零宽度正向前瞻。匹配前瞻中的图案可以匹配的位置。只匹配位置。它不消耗任何字符或扩展匹配。在像一个(?=两个)三个模式中,两个和三个必须在一个匹配的位置匹配。

编辑:MSDN为此提供了better examples

答案 1 :(得分:1)

/ _(+)(烯丙基|自|敌人)/

答案 2 :(得分:1)

此方法将为您提供所需的结果。这使用命名组正则表达式匹配。

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

     return matchedValue;
 }

答案 3 :(得分:0)

我还不能评论梅西修道院的其他答案,所以在这里:

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

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

答案 4 :(得分:0)

这有效

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());
        }
    }