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

时间:2022-03-27 18:49:07

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

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"
<空白>
<空白>

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