2016-03-30 6 views
1

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

junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk 

junk текст представляет неизвестный текст, что я не заинтересован и не хотите сопрягать.

FISH и все косые черты представляют известный текст, который я не хочу, чтобы соответствовать RegEx.

NOTJUNK1 представляет собой неизвестный текст, который я сделать заботиться о и хочет. -Z32 будет происходить после NOTJUNK1, как показано. Я знаю, что будет -Z, но я не знаю два следующих цифры. Это может быть даже одна цифра. Я хочу, чтобы одно или двухзначное значение возвращалось как совпадение (но я не хочу -Z).

И, наконец, NOTJUNK2 также представляет собой неизвестный текст, который я do заботиться и хочет возвращен.

Я использую RegEx в библиотеке .NET.

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

NOTJUNK1 
32 
NOTJUNK2 

Ближайший я пришел был этот RegEx: (?<=FISH/.+/.+/).*?(?=-m[0-9]{1,2}/)?/

возвращает два матча (что близко , но не то, что я хочу):

NOTJUNK1-Z32/ 
NOJUNK2/ 
+1

насчет [ '/ FISH/[^ /] +/[^ /] +/([^ /] *?) -Z (\ d +)/([^ /] +) '] (http://regexstorm.net/tester?p=%2fFISH%2f%5b%5e%2f%5d%2b % 2f% 5b% 5e% 2f% 5d% 2b% 2f (% 5b% 5e% 2f% 5d *% 3f) -Z (% 5CD% 2b)% 2f (% 5b% 5e% 2f% 5d% 2b) и я = нежелательной% 2fFISH% 2fjunk% 2fjunk% 2fNOTJUNK1-Z, 32% 2fNOJUNK2% 2fjunk)? 3 зафиксированных значения: 'NOTJUNK1',' 32' и 'NOJUNK2'. –

ответ

1

Вы можете использовать захватывая группам, как это, чтобы соответствовать.

Regex:(?:.*?\/){4}(.*)-Z(\d{1,2})\/(.*)\/

Пояснение:

  • (?:.*?\/){4} соответствует данным unnecessary и четыре косые.

  • (.*) соответствует NOTJUNK1.

  • -Z(\d{1,2}) соответствует one или two цифры после -Z.

  • (.*) соответствует NOJUNK2

Использование ссылочность номера \1 для NOTJUNK1, \2 для 32 (т.е. число после -Z), \3 для NOJUNK2.

Regex101 Demo

+0

Не нужно ли гарантировать, что '/ FISH /' есть на входе? – anubhava

+0

@anubhava: Поскольку OP упоминается _FISH, а все косые черты представляют собой известный текст, который я не хочу согласовывать с RegEx._ Таким образом, 'FISH' не является существенным. Для этого необходимы только '/' косые черты. Дайте мне знать, если я неправильно понял. –

+0

Я предполагаю, что '/ FISH /' не требуется в согласованных данных, но он все равно должен присутствовать во входе – anubhava

0

попробовать это

string textMatch = "junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk"; 
     Regex r = new Regex(@"/(?<req1>.*?)-Z(?<req2>.*?)/(?<req3>.*?)/", RegexOptions.RightToLeft); 
     MatchCollection mcKVPs = r.Matches(textMatch); 
     var kvps = from Match m in mcKVPs 
        where mcKVPs != null 
        where mcKVPs.Count > 0 
        select new 
        { 
         val1 = m.Groups["req1"].Value, 
         val2 = m.Groups["req2"].Value, 
         val3 = m.Groups["req3"].Value 
        }; 
     var kvp = kvps.FirstOrDefault(); 
+0

'RightToLeft' в данном случае не даст никакого соответствия. Это избыточно. –

+0

, если вы не ставите справа налево, он начнется слева и сравним больше '/' и выйдет из req1 =/FISH/junk/junk/NOTJUNK1 – Krishna

+0

Вот почему вы должны начать с '/ FISH /'. –

Смежные вопросы