7

此示例数据由 Web 服务返回

200,6,“美国加利福尼亚”

我想split(",")使用简单的代码拆分它们并尝试查看结果。

String loc = "200,6,\"California, USA\"";       
String[] s = loc.split(",");

for(String f : s)
   System.out.println(f);

不幸的是,这就是结果

200
6
"California
 USA"

预期的结果应该是

200
6
"California, USA"

我尝试了不同的正则表达式,但没有运气。是否可以在内部转义给定的正则表达式""

更新 1:添加了 C# 代码

更新 2:删除了 C# 代码

4

4 回答 4

3
,(?=(?:[^"]|"[^"]*")*$)

这是您想要的正则表达式(要将其放入 split 函数中,您需要转义字符串中的引号)

解释

您需要找到所有 ',' 不在引号中。这就是您需要前瞻 ( http://www.regular-expressions.info/lookaround.html ) 以查看当前匹配的逗号是在引号内还是在引号内。

为此,我们使用前瞻来确保当前匹配的 ',' 后跟偶数个 '"' 字符(意味着它位于引号之外)

所以 (?:[^"]|"[^"]*")*$意味着只有当有非引号字符直到结尾或一对引号之间有任何内容时才匹配

(?=(?:[^"]|"[^"]*")*$)将前瞻上述比赛

,(?=(?:[^"]|"[^"]*")*$)最后这将匹配所有“,”与上述前瞻

于 2013-02-04T04:03:53.567 回答
2

一个更简单的解决方案可能是使用现有的库,例如OpenCSV来解析您的数据。这可以使用这个库在两行中完成:

CSVParser parser = new CSVParser();
String [] data = parser.parseLine(inputLine);

如果您将来有更复杂的 CSV 值(多行值或元素内带有转义引号的值等),这将变得尤为重要。如果您不想添加依赖项,您可以随时使用他们的代码作为参考(尽管它不是基于 RegEx)

于 2013-02-04T04:16:55.400 回答
0

如果有一个好的 Java 词法分析器/解析器库,您可以定义一个词法分析器,如下面的伪词法分析器代码:

Delimiter: ,
Item: ([^,"]+) | ("[^,"]+")
Data: Item Delimiter Data | Item 

词法分析器的工作方式是它从顶级标记定义(在本例中为数据)开始,并尝试从字符串中形成标记,直到它不能或直到字符串全部消失。因此,对于您的字符串,会发生以下情况:

  • 我想从 200,6 中提取数据,“California, USA”。
  • 我可以将数据从项目、分隔符和数据中提取出来。
  • 我看了 - 200 是一个 Item 然后 , 是一个分隔符,所以我可以标记它并继续。
  • 我想从 6 个“美国加利福尼亚州”中提取数据
  • 我可以将数据从项目、分隔符和数据中提取出来。
  • 我看了 - 6 是一个 Item 然后 , 是一个 Delimiter 所以我可以标记它并继续前进。
  • 我想从“California, USA”中获取数据
  • 我可以将数据从项目、分隔符和数据中提取出来。
  • 我看了 - “California, USA”是一个项目,但我看不到它后面的分隔符,所以让我们试试别的。
  • 我可以从项目中获取数据。
  • 我看了 - “加利福尼亚,美国”是一个项目,所以我可以标记它并继续前进。
  • 字符串为空。我受够了。这是你的代币。

(我从 Python 词法分析器/解析器 PLY 的指南中了解了词法分析器的工作原理:http ://www.dabeaz.com/ply/ply.html )

于 2013-02-04T04:04:54.750 回答
0

你好试试这个表达式。

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String loc = "200,6,\"Paris, France\"";  
        String[] str1 =loc.split(",(?=(?:[^\"]|\"[^\"]*\")*$)");

        for(String tmp : str1 ){
            System.out.println(tmp);
        }

    }

}
于 2013-02-04T05:28:33.713 回答