【问题标题】:Parse without ignoring whitespaces - Java解析而不忽略空格 - Java
【发布时间】:2016-12-02 09:44:01
【问题描述】:

我有以下字符串输入(来自netstat -a 命令):

Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    11453    /run/systemd/shutdownd
unix  2      [ ]         DGRAM                    7644     /run/systemd/notify
unix  2      [ ]         DGRAM                    7646     /run/systemd/cgroups-agent
unix  5      [ ]         DGRAM                    7657     /run/systemd/journal/socket
unix  14     [ ]         DGRAM                    7659     /dev/log
unix  3      [ ]         STREAM     CONNECTED     16620
unix  3      [ ]         STREAM     CONNECTED     16621

同时我试图将上面的字符串解析为:

// lines is an array representing each line above
for (int i = 0; i < lines.length; i++) {
    String[] tokens = lines[i].split("\\s+");
}

我想将tokens 作为一个包含 7 个条目的数组 [Proto, RefCnt, Flag, Type, State, I-Node, Path]。相反,我得到的数组不包括Flags 下的括号和空的State

["unix", "2", "[", "]", "DGRAM", "11453", "/run/systemd/shutdownd"]

而不是

["unix", "2", "[]", "DGRAM", "", "11453", "/run/systemd/shutdownd"]

如何修复我的正则表达式以产生正确的输出?

【问题讨论】:

  • 使用环视(?&lt;!\[)\\s+(?!\])
  • @revo 即使有环视,也缺少一个值(对于状态,数组的长度将是 6 而不是 7。

标签: java regex string parsing


【解决方案1】:

您需要将正则表达式中的最小空格长度设置为 2,尝试像这样拆分:

String[] tokens = lines[i].split("\\s{2,16}+");

或者像@revo 建议使用lookarounds,像这样:

String[] tokens = lines[i].split("(?<!\\[)\\s{2,16}+(?!\\])");

【讨论】:

  • Alexander,缺少一个值,我得到以下输出:[unix, 2, [ ], DGRAM, 11453, /run/systemd/shutdownd]。正确的值为[unix, 2, [ ], DGRAM, "", 11453, /run/systemd/shutdownd]
  • @cybertextron 您也可以添加最大空间长度,例如{2,16}
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多