Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 标记由非单词字符分隔的单词(单引号除外)_Java_Regex_Tokenize - Fatal编程技术网

Java 标记由非单词字符分隔的单词(单引号除外)

Java 标记由非单词字符分隔的单词(单引号除外),java,regex,tokenize,Java,Regex,Tokenize,我尝试实现以下方法:将输入解析为“单词标记”:由非单词字符分隔的单词字符序列。但是,如果非单词字符被引用(在单引号中),则它们可以成为标记的一部分。 我想使用正则表达式,但在获取正确的代码时遇到困难: public static List<String> wordTokenize(String input) { Pattern pattern = Pattern.compile ("\\b(?:(?<=\')[^\']*(?=\')|\\w+)\\b"); Ma

我尝试实现以下方法:将输入解析为“单词标记”:由非单词字符分隔的单词字符序列。但是,如果非单词字符被引用(在单引号中),则它们可以成为标记的一部分。
我想使用正则表达式,但在获取正确的代码时遇到困难:

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;
}
公共静态列表wordTokenize(字符串输入){

Pattern Pattern=Pattern.compile(\\b(?(?您希望匹配最近的单个直撇号之间出现的一个或多个单词字符或子字符串,并从标记中删除所有这些撇号

对匹配项使用以下正则表达式和
。替换(“,”)

(?:\w|'[^']*')+
详情如下:

  • (?:
    -启动非捕获组
    • \w
      -一个单词char
    • |
      -或
    • -一个直接的单引号
    • [^']*
      -除单引号外的任何0+字符
    • -一个直接的单引号
  • )+
    -组结束,出现1次以上
见:

//String s=“此*字符串”只有two@tokens“;//=>[这个,只有two@tokens]
字符串s=“一”二“三”四“二十一”;//=>[onetwotree,four,二十一]
Pattern Pattern=Pattern.compile((?:\\w |'[^']*')+,Pattern.UNICODE\u字符\u类);
匹配器匹配器=模式匹配器;
List tokens=new ArrayList();
while(matcher.find()){
添加(matcher.group(0).replace(“,”);
}

请注意
模式。为
\w
模式添加了UNICODE\u CHARACTER\u CLASS
,以匹配所有UNICODE字母和数字。

可以尝试使用\\w切换吗?请更多关注“单词”“我更愿意关注我的解决方案,而不是从头开始的
@
是一个非单词字符,因此我不理解您在第二种情况下的预期输出。因为它位于“”内部,所以它没有被分隔很好。问题是它分隔了单词中间没有空格且没有特殊字符的内容。”
// String s = "this*string'has only two@tokens'"; // => [this, stringhas only two@tokens]
String s = "one'two''three' '' four 'twenty-one'"; // => [onetwothree, , four, twenty-one]
Pattern pattern = Pattern.compile("(?:\\w|'[^']*')+", Pattern.UNICODE_CHARACTER_CLASS);
Matcher matcher = pattern.matcher(s);
List<String> tokens = new ArrayList<>();
while (matcher.find()){
    tokens.add(matcher.group(0).replace("'", "")); 
}