随笔-86  评论-150  文章-0  trackbacks-0

用,号分隔的正则表达式

先给一个例子吧。

有下列字符串:

“reservation,rental,type”

我想用根据,号,将该字符串转换成数组。不用说,有一个最简单的方法,用string.Split(new char[]{‘,’})可以轻松办到。

string[] strs = string.Split(new char[]{','};
foreach(string str in strs)
{
	//...
}

 

但是,假设某一个数据中本身就包含了,号呢?例如:

“reser,vation,rental,type”

假设reser,vation本身是一个完整的数据,这下如果再用上面的方法就会出大问题了。如果能够用\,之类的标记,将该,号保留在数据中,而不是用作分隔字符串的标记就好了。

所以,思考了一下,试着用正则表达式来解决这个问题。先将代码粘贴在这里,不知道是否有更好的方法。

var spliters = Regex.Split(values, @"([^\\],)");
            
for (int i = 0; i < spliters.Length; ++i)
            {
                if (i % 2 == 1)
                {
                    spliters[i - 1] += spliters[i].Substring(0, 1);
                    spliters[i] = spliters[i].Substring(1);
                }

            }
假设我用上面的正则表达式来分析一下数据。
“reser\,vation,rental,type”
会得到一下结果
reser\,vati
n,
rental
,
type
你会发现,第一个n和,号被作为分隔符捕获。这显然不是我所需要的,所以又用了下面的for循环对该数据进行修正。
for (int i = 0; i < spliters.Length; ++i)
            {
                if (i % 2 == 1)
                {
                    spliters[i - 1] += spliters[i].Substring(0, 1);
                    spliters[i] = spliters[i].Substring(1);
                }

            }

 

修正后的结果是

reser\,vation

,

rental

,

type

不知道大家是否有更好的想法。先谢谢了。

posted on 2010-03-13 09:54 曹宗颖 阅读(1234) 评论(11) 编辑 收藏

评论:
#1楼 2010-03-13 10:51 | sohighthesky      
var str = "reser\\,vation,rental,type";
            string[] arr = Regex.Split(str, @"(?<!\\),");
            foreach (string s in arr)
            {
                richTextBox1.AppendText(s + "\n");
            }

这样再将里面的\去掉?

 回复 引用 查看   
#2楼[楼主] 2010-03-13 11:26 | 曹宗颖      
一个字,酷
 回复 引用 查看   
#3楼 2010-03-13 11:26 | B.T.Q      
这个问题的根本是“,”有二义性,设计数据格式的时候出了问题。
 回复 引用 查看   
#4楼 2010-03-13 17:37 | 杨圣青      
string s = "reser\,vation,rental,type";
s = s.Replace("\,", "$!$!@");
string[] strs = s.Split(new char[]{','});
foreach(string str in strs)  
{  
    str.Replace("$!$!@", "\,");
} 

 回复 引用 查看   
#5楼 2010-03-13 21:00 | sohighthesky      
(?<!Expression)
逆序否定环视,表示所在位置左侧不能匹配Expression
"(?<!\\),",表示匹配“,”左边不能是"\"的,
more information:
http://blog.csdn.net/lxcnn/archive/2009/06/14/4268033.aspx

 回复 引用 查看   
#6楼 2010-03-13 21:02 | 高天蒲      
不错不错!
我占位!

 回复 引用 查看   
#7楼[楼主] 2010-03-13 22:48 | 曹宗颖      
@B.T.Q
本人愚钝,没有看出这种设计数据格式有什么不合理的地方。还请高人指点。
用,号确实是存在二义性,避开的一个方法,是将数据用特殊的格式编码,即保证数据中不可能包含有,号。
但是这种方法使得该数据不得不经过解码才能被人阅读,这对信息的交换不利。
还望B.T.Q多多指教。

 回复 引用 查看   
#8楼[楼主] 2010-03-13 22:55 | 曹宗颖      
@杨圣青
引用杨圣青:
string s = "reser\,vation,rental,type";
s = s.Replace("\,", "$!$!@");
string[] strs = s.Split(new char[]{','});
foreach(string str in strs)  
{  
    str.Replace("$!$!@", "\,");
} 

我不赞同将\,替换成$!$!@,因为并没有方式可以保证数据中不包含$!$!@的可能性,虽然它出现的几率可能会非常低小。

 回复 引用 查看   
#9楼 2010-03-15 00:36 | 蠕虫      
引用曹宗颖:
@杨圣青
引用杨圣青:
string s = "reser\,vation,rental,type";
s = s.Replace("\,", "$!$!@");
string[] strs = s.Split(new char[]{','});
foreach(string str in strs)  
{  
    str.Replace("$!$!@", "\,");
} 

我不赞同将\,替换成$!$!@,因为并没有方式可以保证数据中不包含$!$!@的可能性,虽然它出现的几率可能会非常低小。

作为替代符号,肯定用生僻符号的啦,还用"$!"??为何不用ASCII里边能显示的一些特殊符号呢? 那个对于普通输入基本是不要改存在的。如16禁止数:001-006,015,021,127等这些代表的符号

 回复 引用 查看   
#10楼[楼主] 2010-03-15 21:22 | 曹宗颖      
@蠕虫
引用蠕虫:
引用曹宗颖:
@杨圣青
引用杨圣青:
string s = "reser\,vation,rental,type";
s = s.Replace("\,", "$!$!@");
string[] strs = s.Split(new char[]{','});
foreach(string str in strs)  
{  
    str.Replace("$!$!@", "\,");
} 

我不赞同将\,替换成$!$!@,因为并没有方式可以保证数据中不包含$!$!@的可能性,虽然它出现的几率可能会非常低小。

作为替代符号,肯定用生僻符号的啦,还用"$!"??为何不用ASCII里边能显示的一些特殊符号呢? 那个对于普通输入基本是不要改存在的。如16禁止数:001-006,015,021,127等这些代表的符号

我还以为这个讨论就此结束,又有新的想法,欢迎呀。

 回复 引用 查看   
#11楼 2010-03-16 01:29 | 杨圣青      
@蠕虫
我以为我的代码只是起一个思路的作用,没说一定得用@!啊,呵呵

 回复 引用 查看   
我之前的blog,请访问http://blog.csdn.net/firefox1
昵称:曹宗颖
园龄:4年8个月
粉丝:25
关注:45
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

文章分类

最新评论

阅读排行榜

评论排行榜

推荐排行榜