我期望应用程序提供一个类似于以下内容的字符串:
约翰| COL-DELIM | doe | COL-DELIM | 55 | ROW-DELIM | george | COL-DELIM | jetson | COL-DELIM | 90 | ROW-DELIM |
我想做两件事:
1)验证字符串“ looks”是否正确(即,它是否与正则表达式匹配)
2)拉出每个“行”,然后能够解析每一行
分隔符之间的值(| COL-DELIM |和| ROW-DELIM |)可以是任何值(不仅仅是字符串,数字或其他内容)。
((。)(\ | COL-DELIM \ |)(。)(\ | COL-DELIM \ |)(。*)(\ | ROW-DELIM \ |))+
自然,这对(。*)东西来说是行不通的...任何建议吗?
最佳答案
人们似乎并没有意识到不必为每个任务都使用RE(或SQL,但这是另一个问题:-),尤其是使用过程代码的任务更清洁。
如果您限制使用RE,那么我认为这是缺乏远见的。
我将简单地逐个标记地处理字符串,其中标记是以下之一:
一个非定界符。
列定界符。
行定界符。
从一个空的列列表开始,然后提取(使用indexOf / substring东西)直到下一个第一行/列定界符,然后将该文本添加到列列表中。
如果定界符是列,请继续。
如果定界符是行,请检查列数并根据需要处理列表。
如果没有最后的行定界符,并且列列表为非空,则格式无效。
抱歉,如果您真的想使用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()
中的正确列数(如果您愿意)。关于java - 正则表达式可以匹配除某些定界符之外的所有内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/614469/