C# 匹配下划线之前所有内容的正则表达式
我有一点正则表达式的知识,但我被这一点难倒了。我需要一个正则表达式,它匹配最后一个下划线之前的所有内容,但前提是下划线后面的文本是“self”、“ally”或“敌军” 如果我有这样的输入字符串: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
"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这无疑是可行的,但在这种情况下,我只需要第一个匹配就可以成为结果,而不管分组如何。这无疑是可行的,但在这种情况下,我只需要第一个匹配就可以成为结果,而不管分组如何。