在引号之间解析文本后面没有两个引号

时间:2012-04-27 15:48:34

标签: java regex parsing

我正在解析一个包含数据的文本文件。

无论何时是文本数据,数据都在引号内。例如:“这里有任何文字”

问题是数据内部我也可以引用,但总是会引用另一个引号。例如:“文字,他说”“你好”“”

我尝试了以下内容,没有成功:

  "(.+?)"(?!") 

如何定义与该格式的文本数据匹配的REGEX?

P.S。:不知道它是否有帮助,但每种类型的数据都以;

分隔

5 个答案:

答案 0 :(得分:1)

试试这个正则表达式(未经测试):

"([^"]|"")*"

编辑:(没意识到你不想自己匹配报价)

(?<=")([^"]|"")*(?=")

答案 1 :(得分:1)

参考我之前发布的帖子here,您应该可以使用以下内容:

(?:\"[^\"]*?\")*

答案 2 :(得分:0)

这只会在双引号上分开,但也会分开 给你引号外的数据 - 希望这有帮助

public static void main(String[] args) {
    // TODO code application logic here
    Pattern p = Pattern.compile("[\"]{2}");

    String[] result1 = 
             p.split("\"\"A01 A02\"\" \"\"B01 B02\"\"");
    for (int i=0; i<result1.length; i++)
        System.out.printf("DATA: ]]%s[[\n", result1[i]);
    String[] result3 = 
             p.split("\"\"A21 \" A22\"\" STUFF \"\"B21 B22\"\"");
    for (int i=0; i<result3.length; i++)
        System.out.printf("DATA: ]]%s[[\n", result3[i]);       
}

答案 3 :(得分:0)

我可以确定,有一个字符,不属于消息的一部分,如~,您可以用〜替换“”,进行匹配,最后转换~""返回。

text.replaceAll ("\"\"", "~").
     replaceAll ("(\"[^\"]+)", "($1)").
     replaceAll ("~", "\"\"")

理论上。

实际上,我在开头和结尾都得到匹配的引号,所以这个文字:

echo 'asdf " I say ""hello"" " foo " you say ""goodbye"" "baz' 

被翻译为:

echo 'asdf (" I say ""hello"" )(" foo )(" you say ""goodbye"" )("baz' )

我找不到错误,但也许这个想法很有用。

答案 4 :(得分:0)

如果你可以确定输入结构良好(没有不平衡的引号),那么这是有效的(如果它没有很好地形成,那么你想做什么?):

"(([^"]*?)((""[^"]*?)*?))"(?!")

这是一个引用,后面跟着引号零次或多次,跟随任意数量的组,其中包含一对双引号,后跟任意数量的非引号,并以引号后跟引号结尾

如果您确定每个数据都以";结尾,那么它会变得更容易

"(([^"]*?)((""[^"]*?)*?))";

但是该行中的最后一个是以";结尾还是只是引用?

从JoelFan和OldCurmudgeon的灵感来看,这有点简单:

"((?:[^"]|"")*)"

对于每个模式,数据都在捕获组1.因此,您的代码将类似于:

while (matcher.find()) {
    data = matcher.group(1);
    /* do whatever you want with the data such as replace '""' with '"' */
}

当然,在将它们编写为Java字符串时,您必须转义模式中的引号,因此它们最终在您的代码中看起来像这样:

"\"(([^\"]*?)((\"\"[^\"]*?)*?))\"(?!\")"

"\"(([^\"]*?)((\"\"[^\"]*?)*?))\";"

或(我将在代码中使用的内容)

"\"((?:[^\"]|\"\")*)\""