【问题标题】:How to separate word by comma, space, period(.), tab(\t), parentheses(), brackets[], and curly braces({}) characters in wordcount hadoop?wordcount hadoop中如何用逗号,空格,句点(。),制表符(\ t),括号(),括号[]和花括号({})字符分隔单词?
【发布时间】:2017-04-05 14:09:01
【问题描述】:

我正在使用 Cloudera 教程 here 练习 MapReduce。但是,目前本教程仅在 Java 中使用此正则表达式按空格分割单词:

private static final Pattern WORD_BOUNDARY = Pattern.compile("\\s*\\b\\s*");

但是,除了空格"\\s*"之外,我还想用逗号、句号(.)和制表符(\t)、括号()、方括号[]和花括号({})字符来定义单独的单词.换句话说,我将单词定义为一个字符串,该字符串具有一个或多个由两个非字母数字字符包围的字母数字字符。例如:

  • (cece54) 有一个单词“cece54”,以() 为界
  • {dwd] 有一个单词“dwd”,以{] 为界
  • xxx) 有一个单词“xxx”,由<space>) 绑定
  • 以此类推。

那么我的正则表达式应该如何编写才能满足这个要求呢?

【问题讨论】:

    标签: java regex string hadoop2 word-count


    【解决方案1】:

    所有分隔符都可以用 | 分隔管道符号,可以直接使用Java String类的split方法进行拆分。这将很简单,而不是定义模板。

    我已经添加了一些剩余的可以根据需要添加。

     String str = "Hello World{!]as";
     String splits[] = str.split(" |\\[|\\]|\\{");
     for (String split: splits) {
         System.out.println(split);
     }
    

    【讨论】:

    • 使用字符类不是更容易(更好)吗? [ \\[\\]{]?
    • 您是指为所有分隔符创建字符数组类吗?
    • 我指的是您创建一个由 4 个单字符表达式组成的 4 路 alternation (|) 表达式,而不是一个具有 4 个字符的 character class ([]) .我没有说任何关于数组或任何其他 Java 构造的内容,都是关于正则表达式构造的。
    • 感谢您阐明交替和字符类。我把它和 java 字符类弄混了。
    【解决方案2】:

    如果您将单词定义为一个或多个连续的字母数字字符,则拆分为一个或多个连续的非字母数字字符,即"\\P{Alnum}+""[^a-zA-Z0-9]+"

    例如,请参阅regex101

    您可以在第一个前面加上 (?U),即 "(?U)\\P{Alnum}+",以获得完整的国际 unicode 支持。

    【讨论】:

    • 非常感谢,它就像一个魅力!你救了我的感恩节!上帝保佑你。
    【解决方案3】:

    对正则表达式不是超级熟悉,但我相信代码是

    "\\s*\\b(\\s*|\t*|\{*|\}*)" 等等

    pattern 的 java 文档是 here

    【讨论】:

    • 感谢您提供最快的帮助,但 java 返回了您的代码错误。 MyWordCount.java:83: 错误:非法转义字符 static String regex = "\\s*\\b(\\s*|\t*|\{|\})"; ^ MyWordCount.java:83: 错误:非法转义字符 static String regex = "\\s*\\b(\\s*|\t*|\{|\})";
    猜你喜欢
    • 2018-04-14
    • 2011-01-12
    • 2016-04-12
    • 2017-08-24
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多