首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用正则表达式将句子拆分成标记,去掉所有必要的标点符号,但不包括作为单词一部分的标点符号

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

Stack Overflow用户
提问于 2019-01-24 00:07:11
回答 1查看 73关注 0票数 2

所以我想把一个句子分成不同的标记。但是,我不想去掉我希望成为标记一部分的某些标点符号。例如,如果标点符号后面没有字母,那么“out‘t”应该留在单词的末尾,如果标点符号后面没有字母,那么应该去掉它。那么,“你?”应该转换成“你”和开头一样:“?你”应该是“你”。

代码语言:javascript
运行
复制
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‘t 1 you2 know3

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-24 01:37:23

与拆分相比,您应该更喜欢使用find来查找此正则表达式中所需的所有标记,

代码语言:javascript
运行
复制
[a-zA-Z]+(['][a-zA-Z]+)?

这个正则表达式只允许在其中夹入一个'。如果你想要允许任何其他这样的字符,只要把它放在字符集[']中,现在它只允许一次,如果你想允许多次,你必须在最后用一个*修改?,使它变成零次或多次。

检查修改后的Java代码,

代码语言:javascript
运行
复制
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);
}

指纹,

代码语言:javascript
运行
复制
Hello0
don't1
you2
know3

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

代码语言:javascript
运行
复制
[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+

其基本上在可选地由非字母表字符包围的一个或多个空白上拆分字符串,或者按一个或多个非字母表和非单引号字符的序列拆分。下面是使用split的示例Java代码,

代码语言:javascript
运行
复制
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);
}

指纹,

代码语言:javascript
运行
复制
Hello0
don't1
you2
know3

请注意,我在streams上使用了filter方法来过滤长度为零的标记,因为split可能会在数组开始时生成长度为零的标记。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54331283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档