代码之家  ›  专栏  ›  技术社区  ›  AncientShotgun

自定义类不会过滤掉行尾字符或空格

  •  2
  • AncientShotgun  · 技术社区  · 6 年前

    可能与问题有模糊关系 3100585 .

    以下类的目的是获取包含一行Java源代码的字符串,并将其划分为标记字符串,这些标记字符串将由单独的类进一步解析。split方法中显示的正则表达式将字符串除以运算符字符和空格,保留所有字符,然后类遍历生成的数组并删除所有空格和行尾字符。然后,它将数组转换为ArrayList并返回它。

    public class Lexer {
    
    Lexer() {
    }
    
    public List<String> convertStringToTokens(String input) {
        input = input.trim();
    
        String[] result = input.split("(?<=[-+*\/=\s\<\>\(\)])|(?=[-+*\/=\s\<\>\(\)])");
        List<String> resultList = new LinkedList<>(Arrays.asList(result));
    
        for (Iterator<String> iterator = resultList.iterator(); iterator.hasNext();) {
            String string = iterator.next();
            if (string.isEmpty() || string.matches("\\u000A") ||  string.matches("\\u000D") || string.matches(" ") || string.matches("\\u000B")) {
    
                    iterator.remove();
                }
            }
    
            return resultList;
        }
    }
    

    不幸的是,这个类没有执行预期的角色,我不确定原因是什么。

    这里很可能是正则表达式出错了。

    如果有人知道我在这方面哪里出了错,请通知并提出建议。

    编辑:输入是单个字符串,例如“球体s=新球体(16);”。输出是字符串的ArrayList,(最多)两个字符串的长度,对于上面的输入

    {"Sphere s = new Sphere(16",");"}.
    

    (将右括号与参数分开是有意的。顺便问一下,是否有人也知道如何将参数与左括号分开?)

    1 回复  |  直到 6 年前
        1
  •  0
  •   AncientShotgun    6 年前

    我找到了一个解决方案:只需将lookaround断言中的空格匹配(在提出问题后添加)移动到一个单独的替代匹配,就可以删除空格字符并拆分周围的字符串。

    String[] result = input.split("(?<=[ -+*\/=\s\<\>\(\)])|(?=[ -+*\/=\s\<\>\(\)])");
    

    成为

    String[] result = input.split("(?<=[-+*\/=\s\<\>\(\)])|(?=[-+*\/=\s\<\>\(\)])| ");