Регулярное выражение, которое соответствует всему перед подчеркиванием - PullRequest
1 голос
/ 15 декабря 2010

У меня достаточно знаний о RegEx, но я в тупике.Мне нужен RegEx, который соответствует всему до последнего подчеркивания, но only , если текст после подчеркивания - "я", "союзник" или "враг".

Так что, если у меня есть входные строки, подобные этому:

"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необходимо.

Ответы [ 5 ]

5 голосов
/ 15 декабря 2010

То, что вы хотите, - это взгляд вперед. Примерно так должно работать:

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

(?= ... ) означает в значительной степени то, что вы хотели :

Позитивный прогноз нулевой ширины. Сопоставляется в положении, в котором может быть сопоставлен шаблон внутри прогнозной точки. Соответствует только позиции. Он не потребляет никаких символов и не расширяет соответствие. В такой схеме, как один (? = Два) три, два и три должны совпадать в том месте, где заканчивается совпадение одного.

edit : MSDN имеет лучших примеров для этого.

1 голос
/ 15 декабря 2010

Этот метод даст вам желаемый результат. При этом используется соответствие регулярных выражений именованной группы.

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

     return matchedValue;
 }
1 голос
/ 15 декабря 2010

/ _ (+). (Союзник | самообеспечение | враг) /

0 голосов
/ 15 декабря 2010

Это работает

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());
        }
    }
0 голосов
/ 15 декабря 2010

Я пока не могу комментировать другой ответ от Мэйси Аббатство, так что вот оно:

Если вы хотите сопоставить только слово в конце, вам нужно добавить «$» в конце строки поиска:

/(.+)_(ally|self|enemy)$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...