在正则表达式的基础上拆分字符串

时间:2014-09-22 13:22:56

标签: java regex

我有以下文本文件

"Zanesville,OH"        +39.93830        -82.00830      84ZC  PMNQ
"Zaragoza,Spain"        +41.66670         -1.05000      GWC7  PXB0
"Zurich,Switzerland"        +47.36670         +8.53330      HP9Z  QVT0
"Zwickau,Germany"        +50.70000        +12.50000      J17H  RFH0

现在我想要每行的值。值之间有很多空格。我知道正则表达式可用于获取值。但我无法制作一个。我用来读取文件的代码是这个

File file = new File("C:\\Users\\user\\Desktop\\files\\cities.txt");  
          if (file.exists()) {
              BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
              String line = "";
              while ((line = br.readLine())!= null) {
                  String token[] =line.split(" ");

              }
          }

有谁能告诉我怎样才能获得价值?

3 个答案:

答案 0 :(得分:4)

根据以下正则表达式分割输入,

\\s+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

代码:

String s = "\"Zanesville,OH\"        +39.93830        -82.00830      84ZC  PMNQ\n" + 
        "\"Zaragoza,Spain\"        +41.66670         -1.05000      GWC7  PXB0\n" + 
        "\"Zurich,Switzerland\"        +47.36670         +8.53330      HP9Z  QVT0\n" + 
        "\"Zwickau,Germany, United States\"        +50.70000        +12.50000      J17H  RFH0";
String[] tok = s.split("\\s+(?=(?:[^\"]*+\"[^\"]*+\")*+[^\"]*+$)");
System.out.println(Arrays.toString(tok));

输出:

["Zanesville,OH", +39.93830, -82.00830, 84ZC, PMNQ
"Zaragoza,Spain", +41.66670, -1.05000, GWC7, PXB0
"Zurich,Switzerland", +47.36670, +8.53330, HP9Z, QVT0
"Zwickau,Germany, United States", +50.70000, +12.50000, J17H, RFH0]

答案 1 :(得分:1)

您可以使用line.split("\\s+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")正则表达式模式来制作所需的输出。

答案 2 :(得分:1)

更通用的Excel解决方案,如CSV

这看起来原本是制表符分隔文字,标签被多个空格取代。双引号表示像Excel一样 CSV

由于双引号之间的文本可能包含换行符(多行文本),因此我从整个文本开始。

String encoding =  "Windows-1252"; // English, best would be "UTF-8".
byte[] textAsBytes = Files.readAllBytes(file.toPath());
String text = new String(textAsBytes, encoding);

Excel用于(Windows)行结尾"\r\n"。并以多行文字"\n"

String[] lines = text.split("\r\n");

在多个空格.split(" +")上拆分可能会在引用字段内破坏。所以我使用了一种模式。 此模式使用引用的内容,其中任何内部引用作为两个引号自我转义。或者是一系列非空格。

Pattern pattern = Pattern.compile("\"^([^\"]|\"\")*\"|\\S+");
for (String line: lines) {
     List<String> fields = new ArrayList<>();
     Matcher m = pattern.matcher(line);
     while (m.find()) {
         String field = m.group();
         if (fields.startsWith("\"") && field.endsWith("\"") && field.length() >= 2) {
             field = field.substring(1, field.length() - 1); // Strip quotes.
             field = field.replace("\"\"", "\""); // Unescape inner quotes.
         }
         fields.add(field));
     }
     ...
}