我有一个长字符串格式为:
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)]
我尝试了一些不同的想法,我似乎没有得到任何地方,任何帮助赞赏。
一旦我有匹配的正则表达式,我将能够获得匹配的索引,然后在下一个#
(分隔符)时计算,这将得到我的开始/结束位置这个词,然后我可以将其子串出来以返回完整的单词。
我希望这有道理吗?
答案 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();
可以像这样获得值:
var values = rx1.Matches(s).Cast<Match>().Select(p => p.Value).ToList();
或者在一起:
var values = rx1.Matches(s).OfType<Match>().Select(p => new { p.Index, p.Value }).ToList();
答案 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()