详解.NET字符串解析的具体过程

开发 后端
本文将介绍的是.NET字符串解析的具体过程,希望对大家日常开发工作有所帮助。

.NET字符串解析,在平常的开发工作中很长见,但是不一定大家都能完成好。希望通过本文,能使大家对.NET字符串解析有一个深刻的理解。

.NET字符串解析是程序员工作中非常重要的一部分,也是非常考验编程能力的工作。基本上我在面试程序员的时候,一定会出一道编程题目作为考察的一方面,而这道题目有很大的可能性是做字符串的解析。例如,给出一个模式规则,要求写程序判断某个字符串是否符合特定格式。例如,要求将BB Code转化为HTML。而现在这个趣味编程题,来自于我目前正在进行的项目。因此从实用角度来说,也有一定现实意义。

这个标题基本上没有包含多少信息,不过我也实在不知道该如何描述这个问题。这个任务是要从一个字符串中提取一些信息,于是我们先来定义概念:

首先是“token”,token是最小的信息单元,我们可以把它当作是一个字符串来处理。而多个token则组成了一个token group,token group之间的各token使用“-”进行分割。例如,以下便定义一个了token group:

  1. jeffz-hello-world 

一个token group可以用一个字符串数组或列表来表示,例如上面的字符串则表示一个包含三个token的token group,分别是jeffz,hello和world。多个token group则可以组成一整个字符串信息,我们把它称为text。一个text中的各个token group使用“--”进行分割,例如:

group1-hello--group2-world一个text可以认为是token group的数组或列表。因此,最终从一个text中提取到的信息,则可以用一个字符串数组的列表来表示。例如,以上的text的信息其实就类似于:

  1. new List<string[]> { new string[] { "group1", "hello" }, new string[] { "group2", "world" } } 

不过您想到这样一个问题:“-”是作为分割符使用的,但如果一个token中本身需要包含“-”又该如何呢?于是,我们又引入了单引号,被一组单引号包裹的token,其中所有的“-”被当作是普通的字符处理,不作为分隔符。例如:

jeffz-'hello-world'这样一个字符串所表示的text,它包含一个token group,其中有两个token:

  1. new List<string[]> { new string[] { "jeffz", "hello-world" } } 

但是,既然单引号也有特殊含义了,那么一个token中又如何表示一个单引号呢?于是乎,我们再定义一个规则,如果一个token中需要包含单引号的话,我们需要使用单引号来包含这个token,并且token中的单引号变成两个单引号。例如:

jeffz-'hello''''world'它所表示的数据即为:

  1. new List<string[]> { new string[] { "jeffz", "hello''world" } } 

text中包含四个单引号,但是表示的数据中只有两个单引号,这就是我们的“转义”规则。还有值得注意的是,如果token中需要包含单引号或“-”,那么这个token在表示的时候一定需要用一对单引号包裹起来——这也是为了“简化规则”。

这次的“趣味编程”便是希望写一个方法,从text中提取出“数据”,也就是一个List<string[]>,我们假设所有的输入都是正确的。

那么,这个规则又有什么含义呢?在我的项目中,这个字符串被当作是产品查询页面的URL,表示的自然是产品的查询条件。由于查询条件非常的丰富,还会根据不同的分类有所改变,因此在URL中表现查询条件非常的麻烦。例如,淘宝的查询页面URL便是这样的:

http://search1.taobao.com/browse/0/n-g,geytami-g,geytami-------1------7------------------4----0--------------------g,ojsxgzlsozsv64dsnfrwkwzvgaydalbzhe4tsxi---g,whflzr5rxy-------2-------b--40--coefp-0-all-0.htm?search_multi_condition=1&ssid=s1#ListView但是,这个URL对于某个人来说几乎没有任何可读性。普通用户对此的关注度自然小很多,但是这样的URL也会给开发人员的工作造成不小的麻烦。在我看来,有一个相对易读的规则还是很重要的。此外,据说URL中的关键字对于SEO也很有帮助(当然这点我不确定)。因此,我们设计了本文这种“自洽”的数据表示方式。如果您足够“敏感”的话,会发现作为特殊字符的单引号或是“-”符号,它们在URL上是不需要转义的——这也是我们为它们赋予特殊含义的原因。

于是现在,我们便可以使用这样的URL字符串来表示一个查询条件了:

  1. cpu-3.0g--color-red-green-black--price-5000-8000--weight-'3-'--keywords-'levi''s' 

这个text拆开后的得到的数据便是:

  1. new List<string[]>{    
  2. new string[] { "cpu", "3.0g" },    
  3. new string[] { "color", "red", "green", "black" },    
  4. new string[]   
  5. { "price", "5000", "8000" },   
  6.  new string[] { "weight", "3-" },  
  7.   new string[] { "keywords", "levi's" },} 

于是这个查询条件便是:CPU为3.0G,颜色为红、绿或黑,价格在5000到8000,重量在3千克内,并包含“levi's”关键字的……笔记本?

您也来试试看吧!

原文标题:趣味编程:从字符串中提取信息

链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/10/12/code-for-fun-tokenizer.html

【编辑推荐】

  1. C#集合、C#动态数组的概念浅析
  2. C#动态数组的详解介绍
  3. C#动态数组的应用详解实例
  4. C#数组复制方法详解
  5. C#判断字符串应用详细解析
责任编辑:彭凡 来源: 博客园
相关推荐

2009-11-26 16:26:32

PHP字符串mbstr

2010-01-08 15:11:22

VB.NET字符串转义

2010-02-02 18:01:47

C++字符串替换函数

2011-08-10 18:47:18

Cocoa字符串

2009-11-26 16:43:11

PHP截取中文字符串

2024-04-01 08:41:39

字符串.NET

2009-11-12 11:04:52

2009-12-01 09:18:50

PHP分割字符串

2010-07-14 12:39:30

Prel字符串

2009-10-26 14:06:03

2010-11-25 15:59:33

字符串.NET

2009-12-01 09:52:40

PHP过滤字符串

2010-07-14 12:57:59

Perl字符串

2009-11-26 13:11:24

PHP字符串

2010-11-26 13:27:41

MySQL存储过程

2010-03-22 17:53:50

Python字符Python字符串

2010-03-03 09:12:25

.NET字符串拘留池

2009-11-25 09:13:41

PHP数组转字符串PHP字符串转数组

2009-07-24 11:12:33

ASP.NET连接字符

2010-07-14 16:21:48

Perl
点赞
收藏

51CTO技术栈公众号