为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

手掌心 2022-05-21 17:27:47
所以我希望将一个句子分成单独的标记。但是,我不想去掉我希望成为标记一部分的某些标点符号。例如,如果标点符号后面没有字母,则“没有”应在单词的末尾保留为“没有”,则应将其删除。那么你?” 应该转换为与开头相同的“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
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

而不是拆分,你应该更喜欢使用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()) {

    tokenList.add(m.group());

}


String[] strArray = tokenList.toArray(new String[tokenList.size()]);


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

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

}

印刷,


Hello0

don't1

you2

know3

但是,如果您坚持split只使用方法,那么您可以使用此正则表达式来拆分值,


[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+

它基本上将字符串拆分为一个或多个空格,可选地由非字母字符包围或按一个或多个非字母和非单引号字符的序列拆分。这是使用 split 的示例 Java 代码,


String str = "..  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++) {

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

}

印刷,


Hello0

don't1

you2

know3

请注意,我在流上使用了过滤器方法来过滤零长度的令牌,因为拆分可能会在数组的开头生成零长度的令牌。


查看完整回答
反对 回复 2022-05-21
  • 1 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信