有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何扩展WhitespaceTokenizer?

我需要使用一个标记器来拆分空格上的单词,但是如果空格是带双括号的,它就不会拆分。这里有一个例子:

My input-> term1 term2 term3 ((term4 term5)) term6  

应生成此令牌列表:

term1, term2, term3, ((term4 term5)), term6.  

我认为我可以通过扩展LuceneWhiteSpaceTokenizer来获得这种行为。如何执行此扩展
还有其他解决办法吗

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    我没有尝试扩展标记器,但我这里有一个很好的(我认为)带有正则表达式的解决方案:

    \w+|\(\([\w\s]*\)\)
    

    以及一种方法,该方法通过从reg ex返回数组的匹配组拆分字符串。代码示例:

    class Regex_ComandLine {
    
    public static void main(String[] args) {
        String input = "term1 term2 term3 ((term4 term5)) term6";    //your input
        String[] parsedInput = splitByMatchedGroups(input, "\\w+|\\(\\([\\w\\s]*\\)\\)");
    
        for (String arg : parsedInput) {
            System.out.println(arg);
        }
    }
    
    static String[] splitByMatchedGroups(String string,
                                                String patternString) {
        List<String> matchList = new ArrayList<>();
        Matcher regexMatcher = Pattern.compile(patternString).matcher(string);
    
        while (regexMatcher.find()) {
            matchList.add(regexMatcher.group());
        }
    
        return matchList.toArray(new String[0]);
    }
    

    }

    输出:

    term1
    term2
    term3
    ((term4 term5))
    term6
    

    希望这对你有帮助

    请注意,以下代码使用了通常的split()

    String[] parsedInput = input.split("\\w+|\\(\\([\\w\\s]*\\)\\)");
    

    将不返回任何内容或不返回所需内容,因为它只检查分隔符

  2. # 2 楼答案

    您可以通过扩展WhitespaceTokenizer来实现这一点,但是我希望如果您编写一个^{}来读取WhitespaceTokenizer并根据括号的数量将连续的标记粘贴在一起,会更容易

    重写^{}是编写类似Tokenizer的类时的主要任务。我曾经亲自做过这件事the result可以作为一个例子(尽管由于技术原因,我无法使我的类成为TokenFilter