java - 用于忽略纯空白标记的正则表达式

标签 java regex

我不是正则表达式方面的专家,想知道是否有人可以帮助我:

我想分割以下字符串:

04/16/2015 14:01:58.819   (27327) [ERR] [SYSTEM CALL]  SOCKET BIND port=4664: Address already in use [tsocket:820]

分为以下 5 个标记:

04/16/2015 14:01:58.819
27327
ERR
SYSTEM CALL
SOCKET BIND port=4664: Address already in use [tsocket:820]

下面的 Java 代码使用正则表达式 [()\\[\\]] 帮我实现了这一点,但它效率低下!

List<String> splitline(String line) {
    List<String> tokens = new ArrayList<>();
    int numToks = 0;
    line = line.trim();
    //Question 1: Change regular expression to remove white-space-only tokens!!
    String[] rawToks = line.split("[()\\[\\]]");
    for (String t : rawToks) {
        String token = t.trim();
        if (!token.isEmpty()) {
            if (numToks < 4) {
                tokens.add(token);
            }
            numToks++;
        }
    }
    //Question 2: Can the regular express be enhanced to eliminate this step?
    //In case the last required token contains () or [] then there will be more than 5 tokens,
    //so split by the 4th token (with [] around it) & use the 2nd token from the result
    if (numToks > 4) {
        tokens.add(line.split("\\[" + tokens.get(3) + "\\]")[1].trim());
    }
    return tokens;
}

有人知道上面代码中嵌入的两个问题的答案吗?

编辑:

以下代码回答了上述两个问题,感谢下面接受的答案!

List<String> splitline(String line) {
    return Arrays.asList(line.trim().split("[)\\]]?\\s+[(\\[]|]\\s+", 5)); 
}

最佳答案

\\s*[()\\[\\]]\\s*

您可以简单地以此进行拆分,并使用 java 中提供的 not Nonenotempty 删除空的拆分部分。请参阅演示。

https://regex101.com/r/nS2lT4/6

关于java - 用于忽略纯空白标记的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30637509/

相关文章:

java - Gradle:使用 `Configuration` 及其依赖集找出 Maven 依赖范围

java - 使用 Java 模式的字符串定界符

regex - grep 正则表达式没有正确匹配零

java - 如何查询 PubSub 项目主题/特定主题的 pubsub.topics.list 权限

java - 如何使用一种正则表达式模式使字符串成为 Java 中的另一种正则表达式模式?

c# - 正则表达式删除特定的重复字符

javascript - 如何在正则表达式中添加!=-1?

java - 读取int数组并检查它是否已排序

java - log4j.xml 配置的公共(public)变量

java - 在通用的preparedStatement中处理日期