TA的每日心情 | 擦汗 2020-7-3 13:51 |
---|
签到天数: 19 天 [LV.4]偶尔看看III
|
一个小软件让用户输入一个文本文件,其中含很多关键词和页码数字。现在需要将整个文本文件内容看成一个字符串进行正则处理识别出一个个关键词和页码。
. N( Z W p0 T8 b$ s2 Q6 Q5 l页码和关键词出现的顺序以及数量, 文本文件中每行有几个关键词或页码,每行是关键词开头还是页码开头 —— 等等这一切都无限制。
! l- c2 w t1 P' ^8 i页码和关键词之间的间隔符为A,关键词和关键词之间的间隔符为B。" U9 i: p* u! c- V1 Z- k
A,B这两个字符串并非固定值,事先不知道,是由用户在软件的界面中输入的。
9 s( h" z' s, m+ s
' a$ ^* k$ U+ n% J* `对A,B两个间隔符字符串的要求:- F4 I: X$ a+ n) Y$ a
(1)A和B都是合法的正则表达式0 A7 P& e+ v$ p& i0 R$ p z
(2)A和B都要能匹配换行符\n8 c$ `, k/ n# d. g2 I/ C* H
(3)除以上(1),(2)外,对A和B再无其他任何限制。如:A和B可以相等也可以不相等;某个间隔符可以同时匹配A和B(即符合A条件的间隔符集合可以与符合B条件的间隔符集合有交集);A和B不一定必须是或者包含空白字符;A和B可以是单个字符也可以是多个字符;A和B甚至可以匹配上关键词或其子字符串,只要A和B可以有效非歧义地间隔这些关键词和页码。. U X1 Z) G# ~3 W- q. i- ^4 g& S
举例: / l, w3 P; q( E" O. i! {
\t|\n|aaa 有可能是一个合法关键词间隔符字符串,它表示制表符\t,换行符\n和连续的三个字母aaa都可以作为分隔符,只要关键词中不含制表符,换行符和连续的三个字母aa
) s% Q. z7 [# T1 k. Q3 g" p
, Y# M3 g$ F' ~/ k$ @9 Y {0 [对关键词的要求:6 ?( h# v. [8 Q
关键词和页码相邻时,A不允许匹配关键词和页码(但允许B匹配关键词和页码)- \5 e; M. Z7 K8 w0 ~8 ^
关键词和关键词相邻时,B不允许匹配这两个关键词(但允许A匹配这两个关键词)1 }! r2 s& D; e
关键词不包含回车换行\r和\n,除此之外无其他限制,例如可以包含一个或多个制表符\t+,一个或多个空格
8 `9 _3 g* ~1 K) i* Y$ ~# G$ N6 |6 j/ n6 s$ N- r* z
总之,我的意思就是对间隔符唯一的要求是它可以有效将页码数字和关键词间隔开,且默认换行永远是间隔符。
$ a9 e6 G1 L' f+ n Q
' U1 h9 ^/ V& X" r8 rC#中有一个Regex.Split方法,可以接受一个正则表达式作为间隔符将一个字符串分成众多子字符串,这个方法貌似可以解决以上问题,但我的要求是关键词中有可能合法含有间隔符,如关键词和关键词相邻时,B不允许匹配这两个关键词,但允许A匹配这两个关键词。Regex.Split方法分开的子字符串中是不允许含有这些间隔符的。
- Y. @- i" @# H0 ~/ T/ Y. F) ?- u4 g, H N; ^( a( L
可能我的问题本身就是非法的所以不可能有解答,那么可以再收紧用户输入关键词以及A,B的要求。 |
|