请教正则达人

yangqidong 2009-05-05 03:41:16

string str = "var stock_str='万 科A,8.83,8.80,2009-05-05,15:05:28';";

问题1
只用正则,如何得到如下匹配(注意日期时间中有逗号)
万 科A
8.83
8.80
2009-05-05,15:05:28

问题2
只用正则,能否得到下面的匹配(不使用Replace,SubString等string方法)
万 科A
8.83
8.80
2009-05-05 15:05:28




...全文
310 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangqidong 2009-05-07
  • 打赏
  • 举报
回复
跟我期望的答案还是有些出入,另寻其他方案,谢谢大家!
wackyboy 2009-05-06
  • 打赏
  • 举报
回复

//问题一:
"(?<=')([^,]+),([^,]+),([^,]+),([^']+)" //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 */

wackyboy 2009-05-06
  • 打赏
  • 举报
回复

//问题一:
"(?<=')([^,]+),([^,]+),([^,]+),([^']+)" //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 */
qx8668 2009-05-05
  • 打赏
  • 举报
回复

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();
}
}
}

试试。。。
蓝海D鱼 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 qldsrx 的回复:]
引用 18 楼 yangqidong 的回复:
楼上的,测试了一下,不行呀


他那个不知道哪里找的两串看似很深奥的表达式,其实不是回答你问题用的,无视他,一点看的价值都没有,看了反而白白死亡脑细胞。——还真有这种人啊!
[/Quote]
BS
蓝海D鱼 2009-05-05
  • 打赏
  • 举报
回复

增加了匹配 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\.\-\:]*)
蓝海D鱼 2009-05-05
  • 打赏
  • 举报
回复
还有就是 那个 A 比较特别 不是一般地 A 貌似 字体不一样 还是什么的
蓝海D鱼 2009-05-05
  • 打赏
  • 举报
回复
抱歉 测试的时候 只测试 '万 科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\.\-\:]*)
yangqidong 2009-05-05
  • 打赏
  • 举报
回复
help
qldsrx 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yangqidong 的回复:]
楼上的,测试了一下,不行呀
[/Quote]

他那个不知道哪里找的两串看似很深奥的表达式,其实不是回答你问题用的,无视他,一点看的价值都没有,看了反而白白死亡脑细胞。——还真有这种人啊!
yangqidong 2009-05-05
  • 打赏
  • 举报
回复
楼上的,测试了一下,不行呀
蓝海D鱼 2009-05-05
  • 打赏
  • 举报
回复

1 ^([\u4e00-\u9fa5\sAB]*)|(?<=\d\.\d\d\,\d\.\d\d\,)([0-9\.\-\:\,]*)$|([0-9\.]*)

2 ^([\u4e00-\u9fa5\sAB]*)|([0-9\.\-\:]*)

qldsrx 2009-05-05
  • 打赏
  • 举报
回复
那是捕获匹配,自然需要设定匹配项了,有多少项就需要设定多少项,善用复制粘贴的话,40几项也问题不大。

如果觉得看起来太长了,那还是用Replace算了,因为你要除去的部分有共同性,而保留的项却都不一样,所以除去不需要的方便些。(Replace的方法需要给出吗?)
yangqidong 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 HDNGO 的回复:]
引用 7 楼 yangqidong 的回复:
以后可能还会有其他格式的字符串,用Replace、SubString无法适应新的情况


正则不是一样?你想怎么通用?没看懂需求~
[/Quote]

我的网站会用到别的网站提供的股票数据,比如现在使用 http://www.xxx.com/股票代码,
可以得到上面的股票信息,但这个网站不一定永远都开着,返回的字符串也不一定永远都不变,
我不想把代码写死,我希望
一旦字符串格式变了,我修改一下数据库中的正则表达式就可以了
一旦网站挂了,我修改网站地址和正则表达式
yangqidong 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qldsrx 的回复:]
给出两种情况,第一种是日期时间用空格分割,第二种是日期时间用逗号分割。其它情况自己稍微照着调整下就可以了,很快的。——满足问题二的要求了吧。
[/Quote]

第二种还是需要额外的代码来添加空格,不行。第一种可以,不过能不能简洁一点呢,实际的字符串有40几项数据的。
gyouyang 2009-05-05
  • 打赏
  • 举报
回复
学习
yangqidong 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qldsrx 的回复:]
——是不是你顶楼写错啦!
[/Quote]
没有写错,这是网站提供的股票信息,每个网站返回的格式都不一样
现在我把这个网站路径和正则表达式存入数据库,
当网站失效,我可以动态添加其他网站和对应的正则表达式。
qldsrx 2009-05-05
  • 打赏
  • 举报
回复
给出两种情况,第一种是日期时间用空格分割,第二种是日期时间用逗号分割。其它情况自己稍微照着调整下就可以了,很快的。——满足问题二的要求了吧。

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);
}
HDNGO 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yangqidong 的回复:]
以后可能还会有其他格式的字符串,用Replace、SubString无法适应新的情况
[/Quote]

正则不是一样?你想怎么通用?没看懂需求~
烈火蜓蜻 2009-05-05
  • 打赏
  • 举报
回复
你用正则也是一样的
加载更多回复(8)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧