所以想象你有这样的字符串
o7o7o7o7o7o
有一个明确的o7o
模式
我的方法是在第一个o
之后找到第二个o
,这就是模式,然后查看它是否完全匹配。
字符串是,如何获取第二个var pattern = "o7o7o7o7o7o";
var index = input.IndexOf("*");
的索引?
我尝试过
o
但是,显然,这将获得它找到的第一个{{1}}的第一个索引,我想得到第二个。 我该怎么办?
答案 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
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) {
...
});