如下功能怎么用正则表达式的方式实现?int p5 = 0;
int p6 = 0;
int p = 0;for (int i = 0; i < source.Length; i++)
{
if (source[i] == '&')
{
p++; if (p == 5) p5 = i;
else if (p == 6) p6 = i;
}
}if (p5 > 0 && p6 > 0)
return source.Substring(p5 + 1, p6 - p5 - 1);
else return string.Empty;
int p6 = 0;
int p = 0;for (int i = 0; i < source.Length; i++)
{
if (source[i] == '&')
{
p++; if (p == 5) p5 = i;
else if (p == 6) p6 = i;
}
}if (p5 > 0 && p6 > 0)
return source.Substring(p5 + 1, p6 - p5 - 1);
else return string.Empty;
(?<=(.*?(?:&)){5})[^&]*
Regex reg = new Regex(@"(?<=(?:.*&){5}).*?(?=&)");
MessageBox.Show(reg.Match(str).Value);code]
Regex reg = new Regex(@"(?<=(?:.*&){5}).*?(?=&)");
MessageBox.Show(reg.Match(str).Value);
(?<YOurNeed>(?<=(.*?(?:&)){5})[^&]*)
using System.Text.RegularExpressions;class Test
{
static void Main()
{
foreach (string s in new string[]{"abc", "&&1&&&123&.&.", "i&u"})
{
Console.WriteLine("{0}: [{1}]", s, Get5And6(s));
}
}
// 取第5个&和第6个&之间的字符串
static string Get5And6(string s)
{
return Regex.Match(s, @"(?s)(?:[^&]*&){5}([^&]*)&").Groups[1].Value;
}
}
/* 程序输出:
abc: []
&&1&&&123&.&.: [123]
i&u: []
*/
这个写法很接近了,但是后续的&之间的之后的都被匹配到了
如果&有6个以上的话,这个写法会匹配到第6个和第7个之间的,第7第8之间的...
return Regex.Match(s, @"(?<=([^&]*&){5})[^&]*(?=&)").Value;
&&1&&&123&.&. 匹配结果: &&1&&&123&
试试这个,获取info^.*?(?:&)(.*?(?:&)){4}(?<info>[^&]*)
我的程序运行结果是:&&1&&&123&.&. 匹配结果:[123]
Regex reg = new Regex(@"(?<=(?:.*&){5}).*?(?=&)");
MessageBox.Show(reg.Match(str).Value);
得到的是33
如果是:
string str = "&&\n&111&22&33&123&&44&55&6662&7771&888888&"; 那么,用 .* 就不正确了。
可能是微软把算法封在Regex 类中了,
它只是看起来代码短一点而以,让我们省了很多事,
执行效力应该快不到哪去
以上都不太好
这个"(?n)(?<=^([^&]*&){5})[^&]*"
// 注意有个^表示开始的标志位才行,要不就会将第5第6之间的第6第7等等匹配出来。
// 因为(?<=exp)是零消耗的会从头开始一个一个字符的匹配整个正则 找到匹配的。
以上都可以 但要有 ^ 在开头
return Regex.Match(s, @"(?<=([^&]*&){5})[^&]*(?=&)").Value;
这是返回第一个匹配(如果存在匹配的话),所以没有加 ^ 也不会匹配到6、7个之间。又没有调用 NextMatch(),所以不存在 wackyboy 说的问题,你的担心是没有必要的。
如果这个对效率要求较高,那么肯定是自己写状态机效率高的,楼主的方法用StringBuilder改进一下就是了如果非要用正则,8楼、17楼、34楼的都可以,最近工作太忙,大脑有些秀逗,不太适合回答问题
在整个源字符串匹配成功的情况下,加不加“^”没什么区别,在整个源字符串匹配不成功的情况下,wackyboy 的考虑还是有必要的
在整个源字符串匹配不成功的情况下,会直接 return 一个空字符串,wackyboy 的考虑还是有必要吗?
汗!我只用了substring,又没有用字符串相加,stringbuilder怎么帮我改进?
难道你是说找到第5个&后设置标志,直到第6个&前的字符每个都加起来吗?这样比substring效率会高吗?我确实不知道。
(ps:突然发现我的代码确实有应该改进的地方,很明显少了一个break)
不用Substring,这样的效率低
不过如果涉及到效率,那可能要考虑算法了,这个要找wuyi8808了,wuyi8808是算法高手
Regex reg = new Regex("(?:[^&]*&){5}(?<value>[^&]*)&");
Match m = reg.Match(str);
if(m.Success)
{
MessageBox.Show("获取的字符串是:"+reg.Groups["value"].Value);
}
else
MessageBox.Show("字符串中没有包含6个以上的&字符");