【发布时间】:2020-04-18 15:07:11
【问题描述】:
我尝试实现以下方法:将输入解析为“单词标记”:由非单词字符分隔的单词字符序列。但是,如果非单词字符被引用(在单引号中),它们可以成为标记的一部分。
我想使用正则表达式,但无法正确编写代码:
public static List<String> wordTokenize(String input) {
Pattern pattern = Pattern.compile ("\\b(?:(?<=\')[^\']*(?=\')|\\w+)\\b");
Matcher matcher = pattern.matcher (input);
ArrayList ans = new ArrayList();
while (matcher.find ()){
ans.add (matcher.group ());
}
return ans;
}
我的正则表达式无法识别在没有空格的单词中间开始一个单词并不意味着开始一个新单词。例子:
输入:this-string '只有三个标记' // 有效
输入: "this*string'只有两个@tokens'"
预期:[这个,字符串只有两个@tokens]
实际:[this, string, 只有两个@tokens]输入:“一'二''三'''四'二十一'”
预期:[onetwothree, , 四, 二十一]
实际:[一、二、三、四、二十一]
如何修复空格?
【问题讨论】:
-
也许尝试用 \\w 切换?更多地关注“词”
-
我更喜欢专注于我的解决方案,而不是从头开始一个解决方案
-
@是一个非单词字符,所以我不明白你在第二种情况下的预期输出。 -
因为它在' '里面,不分开也没关系。问题是它分隔了单词中间没有空格且没有特殊字符的东西