请教正则达人 string str = "var stock_str='万 科A,8.83,8.80,2009-05-05,15:05:28';";问题1只用正则,如何得到如下匹配(注意日期时间中有逗号)万 科A8.838.802009-05-05,15:05:28问题2只用正则,能否得到下面的匹配(不使用Replace,SubString等string方法)万 科A8.838.802009-05-05 15:05:28 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题1好办,问题2也就是问题的限制版。既然加了限制,那就只能使用Match来实现了,我想知道匹配的项目是否只有4个?看样子应该是固定数目的,那样就容易实现Match匹配,不固定个数要实现Match虽然也可以,但是效率很低,还不如用Replace。 把单引号里面的内容匹配出来,这个用正则比较方便里面的内容再用逗号分隔(String.Split),分隔出来变成一个长度为5的字符串数组要想取哪部分很容易就弄出来了,干嘛非要用正则呢 这么简单的东西就一定要用正则吗?Split(',') 不是最简单的解决方案,不要把简单的问题复杂化 我的字符串经常都是不一样的,比如,可能会有中间用分号隔开的var stock_str='Xxx;8.83;8.80;2009-05-05 15:05:28';所以我希望保存正则表达式到数据库,根据字符串的不同能选择不同的表达式来分析。所以一定要用正则 都是逗号分的,直接split更快的吧 还不如替换一下split的分隔符 以后可能还会有其他格式的字符串,用Replace、SubString无法适应新的情况 给出两种情况,第一种是日期时间用空格分割,第二种是日期时间用逗号分割。其它情况自己稍微照着调整下就可以了,很快的。——满足问题二的要求了吧。 string str1 = "var stock_str='万 科A,8.83,8.80,2009-05-05 15:05:28';"; Match m1 = Regex.Match(str1, @".+?'([^,]*?),([^,]*?),([^,]*?),([^,]*)'"); if (m1.Success) { MessageBox.Show(m1.Groups[1].Value+System.Environment.NewLine+ m1.Groups[2].Value+System.Environment.NewLine+ m1.Groups[3].Value+System.Environment.NewLine+ m1.Groups[4].Value); } string str2 = "var stock_str='万 科A,8.83,8.80,2009-05-05,15:05:28';"; Match m2 = Regex.Match(str2, @".+?'([^,]*?),([^,]*?),([^,]*?),([^,]*),([^,]*)'"); if (m2.Success) { MessageBox.Show(m2.Groups[1].Value + System.Environment.NewLine + m2.Groups[2].Value + System.Environment.NewLine + m2.Groups[3].Value + System.Environment.NewLine + m2.Groups[4].Value + " " + m2.Groups[5].Value); } 我的网站会用到别的网站提供的股票数据,比如现在使用 http://www.xxx.com/股票代码,可以得到上面的股票信息,但这个网站不一定永远都开着,返回的字符串也不一定永远都不变,我不想把代码写死,我希望一旦字符串格式变了,我修改一下数据库中的正则表达式就可以了一旦网站挂了,我修改网站地址和正则表达式 那是捕获匹配,自然需要设定匹配项了,有多少项就需要设定多少项,善用复制粘贴的话,40几项也问题不大。如果觉得看起来太长了,那还是用Replace算了,因为你要除去的部分有共同性,而保留的项却都不一样,所以除去不需要的方便些。(Replace的方法需要给出吗?) 1 ^([\u4e00-\u9fa5\sAB]*)|(?<=\d\.\d\d\,\d\.\d\d\,)([0-9\.\-\:\,]*)$|([0-9\.]*)2 ^([\u4e00-\u9fa5\sAB]*)|([0-9\.\-\:]*) 抱歉 测试的时候 只测试 '万 科A,8.83,8.80,2009-05-05,15:05:28'没有 测试 var stock_str='万 科A,8.83,8.80,2009-05-05,15:05:28';现在改好了 第二个的 日期 和 时间 只能 做到 分开匹配 想不出 和到一起的办法(?<=')[\u4e00-\u9fa5\sA]*|(?<=\d\.\d\d\,\d\.\d\d\,)([0-9\.\-\:\,]*)|([0-9\.]*)(?<=')[\u4e00-\u9fa5\sA]*|([0-9\.\-\:]*) 增加了匹配 string str = "var stock_str='万 科A,18.83,18.80,2009-05-05,15:05:28';";的 应该好了的(?<=')[\u4e00-\u9fa5\sA]*|(?<=\d+\.\d\d\,\d+\.\d\d\,)([0-9\.\-\:\,]*)|([0-9\.]*)(?<=')[\u4e00-\u9fa5\sA]*|([0-9\.\-\:]*) using System;using System.Text.RegularExpressions;namespace regextest{ class Program { static void Main(string[] args) { string temp = "var stock_str='万 科A,1.83,0.80,2800-12-10,15:05:28;'"; Regex rx = new Regex("^.+'(?<name>.+),(?<price1>(?(?=[1-9])[1-9][\\d]*|0)\\.\\d{2}),(?<price2>(?(?=[1-9])[1-9][\\d]*|0)\\.\\d{2}),(?<date>((?(?=1)19\\d{2}|[2-9]\\d{3}))-(?(?=0)0[1-9]|1[0-2])-[0-3]\\d),(?<time>\\d{2}:\\d{2}:\\d{2});'$"); MatchCollection mcfinal = rx.Matches(temp); GroupCollection gcfinal; foreach (Match mfinal in mcfinal) { gcfinal = mfinal.Groups; Console.WriteLine(gcfinal["name"].Value); Console.WriteLine(gcfinal["price1"].Value); Console.WriteLine(gcfinal["price2"].Value); Console.WriteLine(gcfinal["date"].Value); Console.WriteLine(gcfinal["time"].Value); } Console.ReadKey(); } }}试试 //问题一:"(?<=')([^,]+),([^,]+),([^,]+),([^']+)" //Group[1-4] 即为所求/*Group[1].Value: 万 科A Group[2].Value: 8.83 Group[3].Value: 8.80 Group[4].Value: 2009-05-05,15:05:28 *///问题二://正则表达式是匹配连续的字符串 要想将不连续的字符串拼接 只能在匹配后再操作"(?<=')([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)" /*Group[1].Value: 万 科A Group[2].Value: 8.83 Group[3].Value: 8.80 Group[4].Value + " " + Group[5].Value: 2009-05-05,15:05:28 */ //问题一:"(?<=')([^,]+),([^,]+),([^,]+),([^']+)" //Group[1-4] 即为所求/*Group[1].Value: 万 科A Group[2].Value: 8.83 Group[3].Value: 8.80 Group[4].Value: 2009-05-05,15:05:28 *///问题二://正则表达式是匹配连续的字符串 要想将不连续的字符串拼接 只能在匹配后再操作"(?<=')([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)" /*Group[1].Value: 万 科A Group[2].Value: 8.83 Group[3].Value: 8.80 Group[4].Value + " " + Group[5].Value: 2009-05-05 15:05:28 */ 如何实现C# devexpress控件的多语言 请教下关于正则表达式\n和\r的区别 panel显示问题 C# 裡邊使用Sql的datetime格式問題 求助!使用Winform还是别的?(有图片) 请高手解答!!!! 如何把ADODB转换成SQLCOMMAND? 对一个大表执行一个sql语句,程序无限等待,不抱错,如何解决 为什么ADO.NET和XML结合的那么紧密? 使用VS自带的WSDL工具生成代理类失败 TREEVIEW的一个小问题 c# byte[] 与int转换
所以我希望保存正则表达式到数据库,根据字符串的不同能选择不同的表达式来分析。所以一定要用正则
还不如替换一下split的分隔符
Match m1 = Regex.Match(str1, @".+?'([^,]*?),([^,]*?),([^,]*?),([^,]*)'");
if (m1.Success)
{
MessageBox.Show(m1.Groups[1].Value+System.Environment.NewLine+
m1.Groups[2].Value+System.Environment.NewLine+
m1.Groups[3].Value+System.Environment.NewLine+
m1.Groups[4].Value);
} string str2 = "var stock_str='万 科A,8.83,8.80,2009-05-05,15:05:28';";
Match m2 = Regex.Match(str2, @".+?'([^,]*?),([^,]*?),([^,]*?),([^,]*),([^,]*)'");
if (m2.Success)
{
MessageBox.Show(m2.Groups[1].Value + System.Environment.NewLine +
m2.Groups[2].Value + System.Environment.NewLine +
m2.Groups[3].Value + System.Environment.NewLine +
m2.Groups[4].Value + " " + m2.Groups[5].Value);
}
我的网站会用到别的网站提供的股票数据,比如现在使用 http://www.xxx.com/股票代码,
可以得到上面的股票信息,但这个网站不一定永远都开着,返回的字符串也不一定永远都不变,
我不想把代码写死,我希望
一旦字符串格式变了,我修改一下数据库中的正则表达式就可以了
一旦网站挂了,我修改网站地址和正则表达式
1 ^([\u4e00-\u9fa5\sAB]*)|(?<=\d\.\d\d\,\d\.\d\d\,)([0-9\.\-\:\,]*)$|([0-9\.]*)2 ^([\u4e00-\u9fa5\sAB]*)|([0-9\.\-\:]*)
(?<=')[\u4e00-\u9fa5\sA]*|(?<=\d\.\d\d\,\d\.\d\d\,)([0-9\.\-\:\,]*)|([0-9\.]*)
(?<=')[\u4e00-\u9fa5\sA]*|([0-9\.\-\:]*)
增加了匹配 string str = "var stock_str='万 科A,18.83,18.80,2009-05-05,15:05:28';";的
应该好了的
(?<=')[\u4e00-\u9fa5\sA]*|(?<=\d+\.\d\d\,\d+\.\d\d\,)([0-9\.\-\:\,]*)|([0-9\.]*)
(?<=')[\u4e00-\u9fa5\sA]*|([0-9\.\-\:]*)
using System;
using System.Text.RegularExpressions;namespace regextest
{
class Program
{
static void Main(string[] args)
{
string temp = "var stock_str='万 科A,1.83,0.80,2800-12-10,15:05:28;'";
Regex rx = new Regex("^.+'(?<name>.+),(?<price1>(?(?=[1-9])[1-9][\\d]*|0)\\.\\d{2}),(?<price2>(?(?=[1-9])[1-9][\\d]*|0)\\.\\d{2}),(?<date>((?(?=1)19\\d{2}|[2-9]\\d{3}))-(?(?=0)0[1-9]|1[0-2])-[0-3]\\d),(?<time>\\d{2}:\\d{2}:\\d{2});'$");
MatchCollection mcfinal = rx.Matches(temp);
GroupCollection gcfinal;
foreach (Match mfinal in mcfinal)
{
gcfinal = mfinal.Groups;
Console.WriteLine(gcfinal["name"].Value);
Console.WriteLine(gcfinal["price1"].Value);
Console.WriteLine(gcfinal["price2"].Value);
Console.WriteLine(gcfinal["date"].Value);
Console.WriteLine(gcfinal["time"].Value);
}
Console.ReadKey();
}
}
}试试
//问题一:
"(?<=')([^,]+),([^,]+),([^,]+),([^']+)" //Group[1-4] 即为所求
/*
Group[1].Value: 万 科A
Group[2].Value: 8.83
Group[3].Value: 8.80
Group[4].Value: 2009-05-05,15:05:28
*/
//问题二:
//正则表达式是匹配连续的字符串 要想将不连续的字符串拼接 只能在匹配后再操作
"(?<=')([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)"
/*
Group[1].Value: 万 科A
Group[2].Value: 8.83
Group[3].Value: 8.80
Group[4].Value + " " + Group[5].Value: 2009-05-05,15:05:28 */
//问题一:
"(?<=')([^,]+),([^,]+),([^,]+),([^']+)" //Group[1-4] 即为所求
/*
Group[1].Value: 万 科A
Group[2].Value: 8.83
Group[3].Value: 8.80
Group[4].Value: 2009-05-05,15:05:28
*/
//问题二:
//正则表达式是匹配连续的字符串 要想将不连续的字符串拼接 只能在匹配后再操作
"(?<=')([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)"
/*
Group[1].Value: 万 科A
Group[2].Value: 8.83
Group[3].Value: 8.80
Group[4].Value + " " + Group[5].Value: 2009-05-05 15:05:28 */