我有一点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选项。
答案 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());
}
}