[笔记]如何使用正则表达式提取字符串中的分隔元素

前言:将自己曾经参与的帖子择其精华整理与此,便于将来自己查阅方便,是为之记。

qianduo (flyinsky)在CSDN论坛上发帖询问:“怎么取出字符串到数组中”

例从一个文本文件中一行一行读出数据,然后保存到table中.
AAA,BBB,CCC,DDD
01234,ABC,"AA,BB",ABC
在第二行时怎么取出""里面的内容为一个字符串.
以前是用string.split(",")取出来是变成五个字段了.

snto(神中神)提出两个建议:
1、 更换分隔字符串,如“01234,ABC,"AA,BB",ABC” --> “01234,ABC,"AA|BB",ABC ”
2、 挨行的搜索,找到‘"’字符的时候做一次技术处理,记录位置1,找到第二个‘"’的时候,记录位置2,然后用substring之类的函数截取

sanniko(雁衔泥)的建议也是这样:
1、 取出第一个 “ 的位置
2、 取出最后一个”的位置
3、 用String.Substring

vinsonhwj发现“这种以逗号为分隔的文本格式,是一种CSV文件格式来的。”
并给出了读取CSV格式的代码。

neil_cn(Neil)也给出了读取的代码。

上面的答案都不错,因为用过几次正则表达式,所以我给出的答案是:

Dim  strPattern  As   String   =   " ((""[w, ]+"")|([w ]+)) "
Dim  strLine  As   String   =   " ""AA, BB, c"", 01234,ABC,""AA,BB"",ABC ,x ,""A, BB"" "
Dim  rxg  As   New  System.Text.RegularExpressions.Regex(strPattern)
Dim  ResultCollection  As  System.Text.RegularExpressions.MatchCollection  =  _
    rxg.Matches(strLine)

For   Each  MatchResult  As  System.Text.RegularExpressions.Match  In  ResultCollection
    Debug.WriteLine(MatchResult.Groups(
0 ).ToString())
Next

解释如下:

对于这样的复杂字符串:
"AA, BB, c", 01234,ABC,"AA,BB",ABC ,x ,"A, BB"

根据其特点,要么是不含","的字符串,要么是可能包含","的被引号包围的字符串,
使用如下模式匹配:
(("[/w, ]+")|([/w ]+))

得到如下结果,每个结果分一行:
"AA, BB, c"
 01234
ABC
"AA,BB"
ABC
x
"A, BB"

本以为这就完美解决了问题,可是qianduo(flyinsky)继续又问道:

“123”,”456””789”
123是第一列 456”789 是第二列
那怎么用正则表达式?

难不倒我,正则表达式仍然能够搞定,请看:

使用如下匹配格式:
([/w ]+)|(("[/w, ]+"[/w ]*)+)

(("[/w, ]+"[/w ]*)+) 用来匹配下列格式
"12,9"
"456""789"
"111"adf"22"  "333"

对于下面字符串,够复杂了吧?
"123","456""789","12,9","111"adf"22"  "333"

匹配结果:
"123"
"456""789"
"12,9"
"111"adf"22"  "333"

不屈不挠的qianduo(flyinsky)还有问题:

现在还有一个小的问题..
123,AAA,,qwe,
这样的话只会有三列,而不是四列,第三列为空

杀手锏:(?<=...)和(?=...)

经过测试,使用如下模式可以解决问题:
([/w ]+)|(("[/w, ]+"[/w ]*)+)|((?<=,)(?=,))|(^(?=,))|((?<=,)$)

其中关键点如下:
"((?<=,)(?=,))" 匹配 ",,"
"(^(?=,))"      匹配 行首的","
"((?<=,)$)"     匹配 行尾的","

对于如下字符串:
,,"123","456""789",,,"12,9",123,,"111"adf"22"  "333",,

匹配结果如下:

<空白>
<空白>
"123"
"456""789"
<空白>
<空白>
"12,9"
123
<空白>
"111"adf"22"  "333"
<空白>
<空白>

结论:
正则表达式在匹配东东上的能力不容小视…… 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值