使用正则表达式将句子拆分为标记,去除所有必要的标点符号,不包括作为单词一部分的标点符号

所以我希望将一个句子分成单独的标记。但是,我不想去掉我希望成为标记一部分的某些标点符号。例如,如果标点符号后面没有字母,则“没有”应在单词的末尾保留为“没有”,则应将其删除。那么你?” 应该转换为与开头相同的“you”:“?you”应该是“you”。


String str = "..Hello ?don't #$you %know?";

    String[] strArray = new String[10];


    strArray = str.split("[^A-za-z]+[\\s]|[\\s]");

    //strArray[strArray.length-1]


    for(int i = 0; i < strArray.length; i++) {

        System.out.println(strArray[i] + i);

    }

这应该只是打印出来:hello0 don't1 you2 know3


手掌心
浏览 149回答 1
1回答

蝴蝶刀刀

而不是拆分,你应该更喜欢使用find这个正则表达式来找到你想要的所有标记,[a-zA-Z]+(['][a-zA-Z]+)?这个正则表达式只允许在其中夹入一个'。如果你想允许任何其他这样的字符,只需将它放在字符集中['],现在它只允许一次,如果你想允许多次,你必须?在最后改变 a*使其为零或更多次。签出您修改后的 Java 代码,List<String> tokenList = new ArrayList<String>();String str = "..Hello ?don't #$you %know?";Pattern p = Pattern.compile("[a-zA-Z]+(['][a-zA-Z]+)?");Matcher m = p.matcher(str);while (m.find()) {&nbsp; &nbsp; tokenList.add(m.group());}String[] strArray = tokenList.toArray(new String[tokenList.size()]);for (int i = 0; i < strArray.length; i++) {&nbsp; &nbsp; System.out.println(strArray[i] + i);}印刷,Hello0don't1you2know3但是,如果您坚持split只使用方法,那么您可以使用此正则表达式来拆分值,[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+它基本上将字符串拆分为一个或多个空格,可选地由非字母字符包围或按一个或多个非字母和非单引号字符的序列拆分。这是使用 split 的示例 Java 代码,String str = "..&nbsp; Hello ?don't #$you %know?";String[] strArray = Arrays.stream(str.split("[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+")).filter(x -> x.length()>0).toArray(String[]::new);for (int i = 0; i < strArray.length; i++) {&nbsp; &nbsp; System.out.println(strArray[i] + i);}印刷,Hello0don't1you2know3请注意,我在流上使用了过滤器方法来过滤零长度的令牌,因为拆分可能会在数组的开头生成零长度的令牌。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java