A
aimingoo
Unregistered / Unconfirmed
GUEST, unregistred user!
哈。我有一天做字处理的时候,用到这个破函数,用来用去,用得我一头包。就把源代
码调出来,然后写了一堆Test,得到这么下面的一篇看起来令人昏倒的东东。
一直怕打击大家对extractstrings()的兴趣,所以从来没公开的贴过。哈哈哈~~~
我想看完之后,估计会有很多人痛骂extractstrings()的算法。象beta和creation-zy
这样的人,可能就会立志重写extractstrings()算法了。哈哈哈。
--------------
ExtractStrings()函数的使用
在Classes单元中, ExtractStrings()是这样声明的:
---------------------------------------------------------------------------
function ExtractStrings(Separators, WhiteSpace: TSysCharSet;
Content: PChar
Strings: TStrings): Integer;
---------------------------------------------------------------------------
返回的结果值是Strings.count.
ExtractStrings()函数的功能类型于JS中的split(), 但是ExtractStrings()也存在一
些特殊的地方. 其中, 它的参数:
Separators : 指定分隔符的集合
WhiteSpace : 指定跳过的字符集. 这些字符如果出现在分隔符的后面(下一行的开
始), 将被忽略.
(*) Separators始终包含[#0, #13, #10, '''', '"']这个子集
WhiteSpace始终
包含[#13, #10]这个子集.
ExtractStrings()函数的特殊之处主要在于它对单引号和双引号的处理上. 由于Separators
始终包含['''','"']这个子集, 意味着这样的特殊性将是不可避免的:
1. 除了最未一行, 通常情况下, 返回结果Strings中不会出现奇数个单引号和双引号.
如果Extract的结果使该行中存在有奇数个单引号和双引号, 则该行被剔除.
2. 返回结果Strings的单行中, 可以出现成对的单引号和双引号.
3. 奇数个单引号和双引号不仅影响到本行, 会导致本行被剔除之外, 还会使后续行可
能被剔除. 引号导致剔除的规则为:
(本行引号数 + 后续x行中的引号数 = 偶数)
or
(后续x行 = 最未一行)
如果条件满足, 则本行至第x-1行将被剔除, 而第x行将被显示, 且第x行中存在奇数个
单引号和双引号.
如果在WhiteSpace中包含了单引号或者双引号, 又将会使上述规则进一步复杂化. 表
现是: 在行前存在的任意个单引号和双引号, 将会按照WhiteSpace的指定规则被剔除,
然后再按Separators的规则进一步的分析.
因此, 这会导致原本有偶数个的行也会被剔除.
码调出来,然后写了一堆Test,得到这么下面的一篇看起来令人昏倒的东东。
一直怕打击大家对extractstrings()的兴趣,所以从来没公开的贴过。哈哈哈~~~
我想看完之后,估计会有很多人痛骂extractstrings()的算法。象beta和creation-zy
这样的人,可能就会立志重写extractstrings()算法了。哈哈哈。
--------------
ExtractStrings()函数的使用
在Classes单元中, ExtractStrings()是这样声明的:
---------------------------------------------------------------------------
function ExtractStrings(Separators, WhiteSpace: TSysCharSet;
Content: PChar
Strings: TStrings): Integer;
---------------------------------------------------------------------------
返回的结果值是Strings.count.
ExtractStrings()函数的功能类型于JS中的split(), 但是ExtractStrings()也存在一
些特殊的地方. 其中, 它的参数:
Separators : 指定分隔符的集合
WhiteSpace : 指定跳过的字符集. 这些字符如果出现在分隔符的后面(下一行的开
始), 将被忽略.
(*) Separators始终包含[#0, #13, #10, '''', '"']这个子集
WhiteSpace始终
包含[#13, #10]这个子集.
ExtractStrings()函数的特殊之处主要在于它对单引号和双引号的处理上. 由于Separators
始终包含['''','"']这个子集, 意味着这样的特殊性将是不可避免的:
1. 除了最未一行, 通常情况下, 返回结果Strings中不会出现奇数个单引号和双引号.
如果Extract的结果使该行中存在有奇数个单引号和双引号, 则该行被剔除.
2. 返回结果Strings的单行中, 可以出现成对的单引号和双引号.
3. 奇数个单引号和双引号不仅影响到本行, 会导致本行被剔除之外, 还会使后续行可
能被剔除. 引号导致剔除的规则为:
(本行引号数 + 后续x行中的引号数 = 偶数)
or
(后续x行 = 最未一行)
如果条件满足, 则本行至第x-1行将被剔除, 而第x行将被显示, 且第x行中存在奇数个
单引号和双引号.
如果在WhiteSpace中包含了单引号或者双引号, 又将会使上述规则进一步复杂化. 表
现是: 在行前存在的任意个单引号和双引号, 将会按照WhiteSpace的指定规则被剔除,
然后再按Separators的规则进一步的分析.
因此, 这会导致原本有偶数个的行也会被剔除.