我期待应用程序中的String看起来像:
约翰| COL-DELIM | DOE | COL-DELIM | 55 |行DELIM |乔治| COL-DELIM |杰特森| COL-DELIM | 90 |行DELIM |
我想做两件事:
1)验证字符串"看起来"是否正确(即它是否与正则表达式匹配)
2)拉出每个"行",然后能够解析每一行
分隔符之间的值(| COL-DELIM |和| ROW-DELIM |)可以是任何值(不仅仅是字符串,数字等等).
((.)(\ | COL-DELIM\|)(.)(\ | COL-DELIM\|)(.*)(\ | ROW-DELIM\|))+
当然,这不适用于(.*)事物的b/c ......有什么建议吗?
人们似乎没有得到这样的事实:他们不必使用RE(或SQL,但这是另一个问题:-)用于每个任务,特别是那些程序代码更清晰.
如果你限制自己使用RE,我认为这是缺乏远见.
我只需处理字符串,令牌,令牌,其中令牌是以下之一:
非分隔符.
列分隔符.
行分隔符.
从空列列表开始,然后提取(使用indexOf/substring stuff)直到第一个下一行/列分隔符,将该文本添加到列列表中.
如果分隔符是列,请继续.
如果分隔符是行,请检查列数并根据需要处理列表.
如果没有最终行分隔符且列列表非空,则格式无效.
对不起,如果你真的在使用RE方法,但我不认为这是必需的(甚至是可取的).
伪代码(仅第一次切割,可能略有错误)如下:
def processStr(s): if not s.endsWith ("|ROW-DELIM|"): error "Invalid format" columnList = [] while not s.equals (""): nextRowDelim = s.indexOf ("|ROW-DELIM|") nextColDelim = s.indexOf ("|COL-DELIM|") if nextColDelim == NotFound: nextColDelim = nextRowDelim + 1 nextDelim = minimumOf (nextRowDelim,nextColDelim) columnList.add (s.substring (0, nextDelim)) s = s.substring (nextDelim) if nextDelim == nextRowDelim: s = s.substring (length ("|ROW-DELIM|")) processColumns (columnList) columnList = [] else: s = s.substring (length ("|COL-DELIM|"))
您可以轻松添加代码以检查此代码中的正确列数,或者processColumns()
,如果这是您的愿望.