如何在字符串中找到模式?

时间:2018-10-20 05:48:31

标签: c# .net string algorithm pattern-matching

所以想象你有这样的字符串

o7o7o7o7o7o

有一个明确的o7o模式 我的方法是在第一个o之后找到第二个o,这就是模式,然后查看它是否完全匹配。

字符串是,如何获取第二个var pattern = "o7o7o7o7o7o"; var index = input.IndexOf("*"); 的索引?

我尝试过

o

但是,显然,这将获得它找到的第一个{{1}}的第一个索引,我想得到第二个。 我该怎么办?

4 个答案:

答案 0 :(得分:1)

您可以通过多种方式执行此操作,最快的方法是循环

string pattern = "o7o7o7o7o7o";
int count = 0;
int index = 0;
while(index < pattern.Length)
{
     if(pattern[index] == 'o') count++;
     if(count == 2) break;
     index++;
}

index是您想要的。

Linq:

int index = pattern.Select((x, i) => new { x, i })
              .Where(a => a.x == 'o').Skip(1)
              .FirstOrDefault().i;

string.IndexOf():

int count = 0, index = 0;
do
{
    index = pattern.IndexOf('o', index);
    if (index != -1) { count++; index++; }
} while (index != -1 && count < 2);

还有很多其他方式,但是我认为上面的三个示例都可以,因为我想到的其他方式比较慢(至少可以想到的方式)。

答案 1 :(得分:1)

也可以像这样使用正则表达式:

var pattern = "o7o7o7o7o7o";

var regex = new Regex("7(o)");

var matches = regex.Matches(pattern);

foreach (Match match in matches)
{
    Console.WriteLine(match.Groups[1].Index);
}

答案 2 :(得分:0)

构建前缀函数,并寻找压缩表示形式为described here

  

给出长度为n的字符串s。我们想找到最短的   字符串的“压缩”表示形式,即我们要查找一个   最小长度的字符串t,使得s可以表示为a   t的一个或多个副本的串联。

     

很明显,我们只需要找到t的长度即可。知道   长度,问题的答案将是s的前缀   长度。

     

让我们计算的前缀函数。使用它的最后一个值   我们定义值k =n-π[n-1]。我们将证明,如果k除以n,   那么k就是答案,否则就不存在有效的   压缩,答案是n。

但是您的字符串不能表示为(u)^ w,因为它的末尾有过多的char。在这种情况下,请检查(i+1)的可除性  (我是索引),(i-p[i])

对于s = '1231231231',我们可以得到表示形式(123)^3+1,因为被(i+1)整除的最后一个k[i]=3是9

  i+1: p[i] k[i]
  1 : 0  1 
  2 : 0  2 
  3 : 0  3 
  4 : 1  3 
  5 : 2  3 
  6 : 3  3 
  7 : 4  3 
  8 : 5  3 
  9 : 6  3 
  10 : 7  3 

答案 3 :(得分:0)

要获取第二次出现的o的索引,而两次间隔之间至少没有o,则可以使用捕获组使用正则表达式并获取该组的索引:

^[^o]*o[^o]+(o)

那将匹配:

  • ^断言字符串的开头
  • [^o]*使用否定的字符类匹配0+次而不是o
  • o从字面上匹配o
  • [^o]+使用否定字符类(而不是o匹配1次以上而不是[^o]*(如果也可以有两个连续的o,请使用(o))。
  • o分组捕获string pattern = @"^[^o]*o[^o]+(o)"; string input = @"o7o7o7o7o7o"; Match m = Regex.Match(input, pattern); Console.WriteLine(m.Groups[1].Index); // 2

Regex demo

var array = {
    products: [{
        id: "B10", 
        amount: "2"}], 
    payment: {
        type: "payment-slip", 
        data: {
            name: "DEFECTO", 
            dni: "99999999"}}, 
    csrfmiddlewaretoken: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
};

$.post("{% url 'erp:seller.sell' %}", array, function (data) {
    ...
});

Demo c#