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

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

【讨论】:

毫无疑问,它确实有效,但在这种情况下,我只需要第一个匹配项即可成为结果,无论分组如何。

以上是关于匹配下划线前所有内容的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

python常用re正则表达式大全,查找指定内容

Python之正则表达式

php正则表达怎么把一个字符串中的所有空格都转化为下划线

初始正则表达式

vbs 正则表达式:仅匹配前 2 个下划线之间的文本

正则表达式re模块的基础及简单应用