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

Java 使用正则表达式将句子拆分为标记,去掉所有必要的标点符号,不包括作为单词一部分的标点符号,java,regex,string,Java,Regex,String,所以我想把一个句子分成几个单独的标记。然而,我不想去掉某些标点符号,我希望它们是标记的一部分。例如,如果标点符号后面没有字母,则单词末尾的“没有”应保持为“没有”。所以,“you?”应该转换成“you”,和开头一样:“?you”应该是“you” String str=“…你好?难道你不知道吗?”; String[]strArray=新字符串[10]; strArray=str.split(“[^A-za-z]+[\\s]|[\\s]”); //strArray[strArray.length-1

所以我想把一个句子分成几个单独的标记。然而,我不想去掉某些标点符号,我希望它们是标记的一部分。例如,如果标点符号后面没有字母,则单词末尾的“没有”应保持为“没有”。所以,“you?”应该转换成“you”,和开头一样:“?you”应该是“you”

String str=“…你好?难道你不知道吗?”;
String[]strArray=新字符串[10];
strArray=str.split(“[^A-za-z]+[\\s]|[\\s]”);
//strArray[strArray.length-1]
对于(int i=0;i
这应该只是打印出来: 你好 不要 优2
know3

与拆分相比,您更喜欢使用
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);
}
但是,如果您坚持只使用
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);
}

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

您必须明确解释所有规则。可能您有两个列表:一个包含要保留在单词中的标点符号(将包含引号),另一个包含要忽略的标点符号(将包含问号)。这将需要一个非常长、复杂的正则表达式。最好是编写一个解析器,或者使用一个解析库。很抱歉在我的初始问题中没有提及,但如何在这个正则表达式中添加数字?只添加“0-9”@UlucOzdenvar:“添加数字”是指除了字母表之外,您还想保留数字吗?你可以把
\d
包含在任何你有
a-zA-Z
的地方,这样你基于匹配的解决方案的正则表达式就变成了这个
[a-zA-Z\d]+(['][a-zA-Z\d]+)?
@UlucOzdenvar:你没有在我的答案中找到什么东西,因为它你没有接受我的答案吗?我能帮你解决一些未解决的问题吗?
[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+
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