匹配下划线前所有内容的正则表达式
Posted
技术标签:
【中文标题】匹配下划线前所有内容的正则表达式【英文标题】: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 选项。
【问题讨论】:
【参考方案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());
【讨论】:
毫无疑问,它确实有效,但在这种情况下,我只需要第一个匹配项即可成为结果,无论分组如何。以上是关于匹配下划线前所有内容的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章