2015-08-07 3 views
-4

Я получил длинную строку в формате:Regex Помощь Строка Matching

WORD_1#WORD_3#WORD_5#CAT_DOG_FISH#WORD_2#WORD_3#CAT_DOG_FISH_2#WORD_7 

Я пытаюсь динамически соответствовать строке, так что я могу вернуть свои позиции в строке.

Я знаю, что строка начнется с CAT_DOG_, но FISH будет динамичной и может быть чем угодно. Важно также, чтобы не соответствовать на CAT_DOG_FISH_2(int)

В принципе, мне нужно, чтобы получить обратно матч на любое слово, начиная с [CAT_DOG_], но не заканчивается в [_(int)]

Я пытался несколько различных думать, и я не похоже, что-то в любом месте, любая помощь ценится.

Как только у меня будет регулярное выражение, я смогу получить индекс совпадения, а затем выработать, когда следующий # (разделитель), который даст мне начальную/конечную позицию слова, Затем я могу подстроить его, чтобы вернуть полное слово.

Надеюсь, это имеет смысл?

+2

Добавить 'regex', который вы пробовали – Tushar

+0

Попробуйте это [** regex **] (https://regex101.com/r/fV0jF5/2). '(CAT_DOG _ [^ \ d] *) #' –

+0

или этот номер (CAT_DOG_ [a-zA-Z] *) # –

ответ

0

Спасибо за помощь, ребята, так как я знаю Int строка будет заканчиваться я остановился на этом:

int i = 0; 

     string[] words = textBox1.Text.Split('#'); 

     foreach (string word in words) 
     { 
      if (word.StartsWith("CAT_DOG_") && (!word.EndsWith(i.ToString()))) 
      { 
       //process here 
       MessageBox.Show("match is: " + word); 
      } 
     } 

Благодаря Эзер указал мне в сторону String.Split()

0

Вы можете использовать следующее регулярное выражение:

\bCAT_DOG_[a-zA-Z]+(?!_\d)\b 

См demo

Или (если FISH действительно ничего, но не _ или #):

\bCAT_DOG_[^_#]+(?!_\d)\b 

См demo

Границы слов \b с опережением (?!_\d) (это означает, что не должно быть _ и цифры), чтобы помочь нам вернуть только необходимые строки. Класс символов [^_#] соответствует любому символу, но _ или #.

Вы можете получить индексы с помощью LINQ:

var s = "WORD_1#WORD_3#WORD_5#CAT_DOG_FISH#WORD_2#WORD_3#CAT_DOG_FISH_2#WORD_7"; 
var rx1 = new Regex(@"\bCAT_DOG_[^_#]+(?!_\d)\b"); 
var indices = rx1.Matches(s).Cast<Match>().Select(p => p.Index).ToList(); 

enter image description here

Значение может быть получен следующим образом:

var values = rx1.Matches(s).Cast<Match>().Select(p => p.Value).ToList(); 

enter image description here

или вместе:

var values = rx1.Matches(s).OfType<Match>().Select(p => new { p.Index, p.Value }).ToList(); 

enter image description here

+0

Если есть какие-либо сомнения, сообщите мне. BTW, вы также можете использовать '.OfType ()' вместо '.Cast ()'. –

+0

Также проверьте ['\ bCAT_DOG_ (?! [^ #] * _ \ D) [^ #] *'] (http://regexstorm.net/tester?p=%5cbCAT_DOG_ (% 3f!% 5b% 5e % 23% 5d * _% 5cd)% 5b% 5e% 23% 5d * & i = WORD_1% 23WORD_3% 23WORD_5% 23CAT_DOG_FISH% 23WORD_2% 23WORD_3% 23CAT_DOG_FISH_2% 23WORD_7), возможно, он будет работать лучше для вас, так как мы не знаем ваш вход хорошо. –

0

Лично я избегаю Regex всякий раз, когда это возможно, как я нахожу их трудно читать и поддерживать, если вы не используете их много, так что здесь не является регулярное выражение решение:

string words = "WORD_1#WORD_3#WORD_5#CAT_DOG_FISH#WORD_2#WORD_3#CAT_DOG_FISH_2#WORD_7"; 
var result = words.Split('#') 
    .Select((w,p) => new { WholeWord = w, SplitWord = w.Split('_'), Position = p, Dynamic = w.Split('_').Last() }) 
    .FirstOrDefault(
     x => x.SplitWord.Length == 3 && 
     x.SplitWord[0] == "CAT" && 
     x.SplitWord[1] == "DOG"); 

Это дает вы все это слово, динамическая часть и позиция. Я полагаю, что динамическая часть не имеет подчеркивания.