我期望应用程序提供一个类似于以下内容的字符串:

约翰| 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/

10-09 09:22