Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匹配下划线之前所有内容的正则表达式_C#_.net_Regex_C# 4.0 - Fatal编程技术网

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

C# 匹配下划线之前所有内容的正则表达式,c#,.net,regex,c#-4.0,C#,.net,Regex,C# 4.0,我有一点正则表达式的知识,但我被这一点难倒了。我需要一个正则表达式,它匹配最后一个下划线之前的所有内容,但前提是下划线后面的文本是“self”、“ally”或“敌军” 如果我有这样的输入字符串: "hero_anti_infantry_melee_2_self" "anti_infantry_ranged_2_ally" "suppression_aoe_enemy" "reinforce_btn_down" "inset_energy" "suppressed" 我希望它们输出为: "her

我有一点正则表达式的知识,但我被这一点难倒了。我需要一个正则表达式,它匹配最后一个下划线之前的所有内容,但前提是下划线后面的文本是“self”、“ally”或“敌军”

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

"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匹配

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

     return matchedValue;
 }
私有静态字符串GetStringBeforeUnderline(字符串输入)
{
字符串匹配值=
Regex.Match(输入,“(?*)[124;](自身|盟友|敌人)”).Groups[“Group”].ToString();
返回匹配值;
}

此方法将为您提供所需的结果。这使用命名组regex匹配

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

     return matchedValue;
 }
私有静态字符串GetStringBeforeUnderline(字符串输入)
{
字符串匹配值=
Regex.Match(输入,“(?*)[124;](自身|盟友|敌人)”).Groups[“Group”].ToString();
返回匹配值;
}

我还不能对梅西修道院的另一个答案发表评论,所以这里是:

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

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

我还不能对梅西修道院的另一个答案发表评论,所以这里是:

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

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

你想要的是向前看。像这样的方法应该会奏效:

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

零宽度正向前瞻。在一个位置进行匹配,在该位置可以匹配前瞻中的模式。只匹配位置。它不使用任何字符或展开匹配。在像1(?=2)3这样的模式中,2和3必须在1的匹配结束的位置匹配


编辑:MSDN已对此进行了测试。

您需要的是前瞻性。像这样的方法应该会奏效:

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

零宽度正向前瞻。在一个位置进行匹配,在该位置可以匹配前瞻中的模式。只匹配位置。它不使用任何字符或展开匹配。在像1(?=2)3这样的模式中,2和3必须在1的匹配结束的位置匹配

编辑:MSDN已对此进行了修改。

此操作有效

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());
        }
    }
这很有效

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

我对它进行了测试,看起来该模式在下划线后面包含了敌人\ally\self。我宁愿它匹配最后一个下划线,但前提是它后面的字母是敌我(见前3个示例)。还有,前后的斜杠是什么?这是php/perl语法,您只需要检查匹配的第一次捕获。(.+)(ally | self | defect)我测试了它,它看起来在下划线后面包含了敌人\ ally \ self。我宁愿它匹配最后一个下划线,但前提是它后面的字母是敌我(见前3个示例)。还有,前后的斜杠是什么?这是php/perl语法,您只需要检查匹配的第一次捕获。(.+)(盟友、自己、敌人)也意识到我举了错误的例子。我不确定这是否会影响,因为这个正则表达式似乎不起作用。我在正则表达式中输入了一个错误-
)$
,而不是
$)
。我还把它改成了C#语法——实际上这次我检查了它的工作原理。工作得非常好。我认为使用前瞻是最有意义的+1也意识到我举了错误的例子。我不确定这是否会影响,因为这个正则表达式似乎不起作用。我在正则表达式中输入了一个错误-
)$
,而不是
$)
。我还把它改成了C#语法——实际上这次我检查了它的工作原理。工作得非常好。我认为使用前瞻是最有意义的+1这无疑是可行的,但在这种情况下,我只需要第一个匹配就可以成为结果,而不管分组如何。这无疑是可行的,但在这种情况下,我只需要第一个匹配就可以成为结果,而不管分组如何。