【问题标题】:Using regex to split sentence into tokens stripping it of all the necessary punctuation excluding punctuation that is part of a word使用正则表达式将句子拆分为标记,去除所有必要的标点符号,不包括作为单词一部分的标点符号
【发布时间】:2019-01-23 16:07:10
【问题描述】:

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

这应该只是打印出来: 你好0 不要1 你2 知道3

【问题讨论】:

  • 您必须明确解释所有规则。可能您有两个列表:一个包含要保留在单词中的标点符号(将包含引号),另一个包含要忽略的标点符号(将包含问号)
  • 这需要一个很长、很复杂的正则表达式。最好写一个解析器,或者使用解析库。

标签: java regex string


【解决方案1】:

您应该更喜欢使用find 来使用此正则表达式查找所有令牌,而不是拆分,

[a-zA-Z]+(['][a-zA-Z]+)?

这个正则表达式只允许在其中夹入一个'。如果您想允许任何其他此类字符,只需将其放在字符集 ['] 中,现在它只允许一次,如果您想允许多次,您必须在末尾更改 ? * 使其零次或多次。

检查您修改后的 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

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

【讨论】:

  • 很抱歉在我最初的问题中没有提及,但是如何在这个正则表达式中添加数字,只需添加“0-9”?
  • @UlucOzdenvar:“添加数字”是指除了字母之外还想保留数字吗?您可以在任何有a-zA-Z 的地方包含\d,这样您基于匹配的解决方案的正则表达式就变成了[a-zA-Z\d]+(['][a-zA-Z\d]+)?
  • @UlucOzdenvar:您是否没有在我的答案中找到您正在寻找的东西,因为您不接受我的答案?我可以帮助您解决未解决的问题吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2010-09-26
相关资源
最近更新 更多