如何在wordcount hadoop中用逗号、space、句点(.)、制表符(\t)、圆括号()、方括号[]、大括号({})分隔单词?
How to separate word by comma, space, period(.), tab(\t), parentheses(), brackets[], and curly braces({}) characters in wordcount hadoop?
我正在使用 Cloudera turotial 练习 MapReduce here。但是,目前本教程仅使用 Java 中的此正则表达式按 space 拆分单词:
private static final Pattern WORD_BOUNDARY = Pattern.compile("\s*\b\s*");
不过,除了space "\s*"
,我还想用逗号、句号(.)和制表符(\t)、圆括号()、方括号[]来定义分隔词,和花括号 ({}) 字符。换句话说,我将单词定义为一个字符串,该字符串具有一个或多个由两个非字母数字字符界定的字母数字字符。例如:
- (cece54) 有一个词 "cece54" 由
()
界定
- {dwd] 有一个单词 "dwd" 由
{]
限定
- xxx) 有一个单词 "xxx" 由
<space>
和 )
绑定
- 等等等等。
那么我的regex应该怎么写才能达到这个要求呢?
不是很熟悉正则表达式,但我相信代码是
"\s*\b(\s*|\t*|\{*|\}*)"
等等
模式的 java 文档是 here
如果您将一个词定义为一个或多个连续的字母数字字符,则拆分为一个或多个连续的非字母数字字符,即 "\P{Alnum}+"
或 "[^a-zA-Z0-9]+"
.
例如参见regex101。
您可以在第一个前面加上 (?U)
,即 "(?U)\P{Alnum}+"
,以获得完整的国际 unicode 支持。
所有分隔符都可以用|分隔管道符,可以直接使用JavaStringclass的split方法进行拆分。这比定义模板更简单。
我已经添加了,剩下的可以根据需要添加。
String str = "Hello World{!]as";
String splits[] = str.split(" |\[|\]|\{");
for (String split: splits) {
System.out.println(split);
}
我正在使用 Cloudera turotial 练习 MapReduce here。但是,目前本教程仅使用 Java 中的此正则表达式按 space 拆分单词:
private static final Pattern WORD_BOUNDARY = Pattern.compile("\s*\b\s*");
不过,除了space "\s*"
,我还想用逗号、句号(.)和制表符(\t)、圆括号()、方括号[]来定义分隔词,和花括号 ({}) 字符。换句话说,我将单词定义为一个字符串,该字符串具有一个或多个由两个非字母数字字符界定的字母数字字符。例如:
- (cece54) 有一个词 "cece54" 由
()
界定
- {dwd] 有一个单词 "dwd" 由
{]
限定
- xxx) 有一个单词 "xxx" 由
<space>
和)
绑定
- 等等等等。
那么我的regex应该怎么写才能达到这个要求呢?
不是很熟悉正则表达式,但我相信代码是
"\s*\b(\s*|\t*|\{*|\}*)"
等等
模式的 java 文档是 here
如果您将一个词定义为一个或多个连续的字母数字字符,则拆分为一个或多个连续的非字母数字字符,即 "\P{Alnum}+"
或 "[^a-zA-Z0-9]+"
.
例如参见regex101。
您可以在第一个前面加上 (?U)
,即 "(?U)\P{Alnum}+"
,以获得完整的国际 unicode 支持。
所有分隔符都可以用|分隔管道符,可以直接使用JavaStringclass的split方法进行拆分。这比定义模板更简单。
我已经添加了,剩下的可以根据需要添加。
String str = "Hello World{!]as";
String splits[] = str.split(" |\[|\]|\{");
for (String split: splits) {
System.out.println(split);
}