正则表达式帮助字符串匹配

时间:2015-08-07 08:05:45

标签: c# regex

我有一个长字符串格式为:

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)]

结尾的任何字词的匹配

我尝试了一些不同的想法,我似乎没有得到任何地方,任何帮助赞赏。

一旦我有匹配的正则表达式,我将能够获得匹配的索引,然后在下一个#(分隔符)时计算,这将得到我的开始/结束位置这个词,然后我可以将其子串出来以返回完整的单词。

我希望这有道理吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我个人尽可能避免使用正则表达式,因为我发现它们很难阅读和维护,除非你经常使用它们,所以这里有一个非正则表达式解决方案:

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");

它为您提供了整个单词,动态部分和位置。我确实假设动态部分没有下划线。

答案 2 :(得分:0)

感谢帮助人员,因为我知道字符串将结束,我已经解决了这个问题:

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

感谢Eser将我指向String.Split()