【问题标题】:Regex split with a delimiter that contains no others on it's side [duplicate]正则表达式使用分隔符拆分,该分隔符旁边不包含其他分隔符[重复]
【发布时间】:2013-09-08 20:28:09
【问题描述】:

我被正则表达式的这个问题所困扰。

假设我有一个从包含文件的文件中读取的字符串。

first_name, Hello, "test Drive"

然后我将使用, 作为分隔符来使用split。我会得到

myString[0] = "first_name";
myString[1] = "Hello";
myString[2] = "\"test Drive\"";

我的问题是当系统读取双引号内带有, 的字符串时

first_name, Hello, "test, Drive"

我明白了

myString[0] = "first_name";
myString[1] = "Hello";
myString[2] = "\"test"
myString[3] = "Drive\"";

我的问题

我将如何使用, 作为分隔符拆分字符串,条件是它的左侧和右侧都没有".. 还是有一些更容易的解决方法?

谢谢。

【问题讨论】:

  • 这就是使用上下文无关语言提取上下文相关数据的根本问题。好消息是,使用现代正则表达式实现,您可以完成大部分操作,但您不会忘记这样一个事实,即 ... 内的引号内的引号最终达到了可能的极限。考虑使用适当的解析器,例如来自 CSV 库的解析器。
  • 您必须更准确、更正式地了解所使用的语法。第一段可以有引号吗?和秒?当引号出现在带引号的字符串中时会附加什么?他们逃脱了吗? BNF 语法定义可能有用...
  • 你会得到很多重复,搜索谷歌skip comma in double quote string split regex,第一页只给你stackoverflow链接:)

标签: java regex string


【解决方案1】:

您似乎正在处理 CSV 文件。您是否已经考虑过使用其中一个 CSV 库来执行此操作(如 opencsv 或 supercsv)?

【讨论】:

  • 只是一些普通的*.txt 文件。上面有一些"。但我会检查一些图书馆。
  • 如果该文件包含特定格式,例如:“每行有三个字段,用逗号分隔,最后一个字段是带引号的字符串”,则视为 CSV 文件 = D
【解决方案2】:

如果您知道明确的正则表达式限制,直到那时您想要拆分,那么下面将适用于您

        String test = "first_name, Hello, \"test, Drive\"";


        String[] tests = test.split(", ", 3);

        System.out.println("1  " + tests[0]);
        System.out.println("1  " + tests[1]);
        System.out.println("1  " + tests[2]);

 output :-
   1  first_name
   2  Hello
   3  "test,Drive"

如果您不知道限制,则输入字符串应采用以下格式,如果您可以在 qutoes 中格式化字符串,该字符串只有 (,) 而没有空格.. 其他文本分隔符带有一个逗号 (,) 和空格 ()

String test = "first_name, Hello, \"test,Drive\"";


        String[] tests = test.split(", ");

        System.out.println("1  " + tests[0]);
        System.out.println("1  " + tests[1]);
        System.out.println("1  " + tests[2])

output :-
       1  first_name
       2  Hello
       3  "test,Drive"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多