java - 使用 Split 方法创建分词器

标签 java design-patterns split token tokenize

我正在尝试创建简单的分词器,该分词器可以按空格分割、小写标记、删除所有非字母字符,并仅保留具有 3 个或更多字符的术语。我编写这段代码,它已经准备好处理小写、非字母字符,并且只保留 3 个或更多字符。但我想使用 split 方法,但我不知道如何。请提出一些建议。

public class main {

    public static final String EXAMPLE_TEST = "This Mariana John bar Barr "
        + "12364 FFFFF aaaa a s d f g.";

    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("(\\s[a-z]{3,20})");
        Matcher matcher = pattern.matcher(EXAMPLE_TEST);

        while (matcher.find()) {
            System.out.print("Start index: " + matcher.start());
            System.out.print(" End index: " + matcher.end() + " ");
            System.out.println(matcher.group());
        }
    }
}

最佳答案

如果您不必跟踪索引:

List<String> processed = Arrays.stream(EXAMPLE_TEST.split(" ")).map(String::toLowerCase)
            .map(s -> s.replaceAll("[^a-z]", "")).filter(s -> s.length() >= 3).collect(Collectors.toList());
for (String s : processed) {
    System.out.println(s);
}

但是您的示例输出也显示了索引。然后你必须将其存储在额外的容器中(如 map ):

Map<Integer, String> processed = Arrays.stream(EXAMPLE_TEST.split(" ")).collect(Collectors.toMap(s -> EXAMPLE_TEST.indexOf(s), s -> s.toLowerCase().replaceAll("[^a-z]", "")));
Map<Integer, String> filtered = processed.entrySet().stream().filter(entry -> entry.getValue().length() >= 3).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
for (Map.Entry<Integer, String> entry : filtered.entrySet()) {
    System.out.println("Start index: " + entry.getKey() + " " + entry.getValue());
}

关于java - 使用 Split 方法创建分词器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53016006/

相关文章:

design-patterns - 在 Clojure 中设计关键字

使用多个定界符拆分的 Java 字符串

java - 在java中拆分字符串时出错

java - 亚马逊简单数据库 : KeyStoreException problem accessing trust store

java - @QueryResult 映射错误

java - SimpleDateFormat setTimeZone 不工作

oop - 命令模式如何参数化具有不同请求的客户端?

.net - 领域驱动设计 : How to access child of aggregate root

java - 针对 : while (true) 的优化

Java:拆分以逗号分隔的字符串但忽略括号中的逗号