如何在Java中将句子拆分为单词和标点符号

时间:2019-09-09 16:38:32

标签: java regex split

我想将给定的字符串类型的句子拆分为单词,并且还希望将标点符号添加到列表中。

例如,如果句子是:“萨拉的狗'咬住了邻居”。
我希望输出为: [Sara's,dog,',bit,',the,neighbour,。]

使用string.split(“”),我可以按空格将单词分成单词,但我希望标点符号也出现在结果列表中。

    String text="Sara's dog 'bit' the neighbor."  
    String list = text.split(" ")
    the printed result is [Sara's, dog,'bit', the, neighbour.]
    I don't know how to combine another regex with the above split method to separate punctuations also.

我已经尝试了一些参考,但是没有解决

1。Splitting strings through regular expressions by punctuation and whitespace etc in java

2。How to split sentence to words and punctuation using split or matcher?

示例输入和输出

String input1="Holy cow! screamed Jane."

String[] output1 = [Holy,cow,!,screamed,Jane,.] 

String input2="Select your 'pizza' topping {pepper and tomato} follow me."

String[] output2 = [Select,your,',pizza,',topping,{,pepper,and,tomato,},follow,me,.]

3 个答案:

答案 0 :(得分:0)

与其试图提出一种模式,不如通过提出一种捕获元素的模式来解决这一难题。

尽管代码比简单的split()多,但仍可以在Java 9+中的单个语句中完成:

String regex = "[\\p{L}\\p{M}\\p{N}]+(?:\\p{P}[\\p{L}\\p{M}\\p{N}]+)*|[\\p{P}\\p{S}]";
String[] parts = Pattern.compile(regex).matcher(s).results().map(MatchResult::group).toArray(String[]::new);

在Java 8或更早版本中,您可以这样编写:

List<String> parts = new ArrayList<>();
Matcher m = Pattern.compile(regex).matcher(s);
while (m.find()) {
    parts.add(m.group());
}

说明

\p{L}是Unicode 字母\\p{N}是Unicode 数字\\p{M}是Unicode 标记(例如重音符号)。结合起来,它们在这里被视为“单词”中的字符。

\p{P}是Unicode 标点符号。 “单词”可以在单词内 内嵌入单个标点符号。给定定义,|之前的模式与“单词”匹配。

\p{S}是Unicode 符号。未嵌入在“单词”中的标点符号和符号分别进行匹配。这就是|之后的模式。

这将使Unicode类别Z分隔符)和C other )未被发现,这意味着将跳过所有此类字符。 / p>

测试

public class Test {
    public static void main(String[] args) {
        test("Sara's dog 'bit' the neighbor.");
        test("Holy cow! screamed Jane.");
        test("Select your 'pizza' topping {pepper and tomato} follow me.");
    }
    private static void test(String s) {
        String regex = "[\\p{L}\\p{M}\\p{N}]+(?:\\p{P}[\\p{L}\\p{M}\\p{N}]+)*|[\\p{P}\\p{S}]";
        String[] parts = Pattern.compile(regex).matcher(s).results().map(MatchResult::group).toArray(String[]::new);
        System.out.println(Arrays.toString(parts));
    }
}

输出

[Sara's, dog, ', bit, ', the, neighbor, .]
[Holy, cow, !, screamed, Jane, .]
[Select, your, ', pizza, ', topping, {, pepper, and, tomato, }, follow, me, .]

答案 1 :(得分:0)

Arrays.stream( s.split("((?<=[\\s\\p{Punct}])|(?=[\\s\\p{Punct}]))") )
.filter(ss -> !ss.trim().isEmpty())
.collect(Collectors.toList())

参考:

How to split a string, but also keep the delimiters?

Regular Expressions on Punctuation

答案 2 :(得分:-1)

ArrayList<String> chars = new ArrayList<String>();
String str = "Hello my name is bob";
String tempStr = "";
for(String cha : str.toCharArray()){
  if(cha.equals(" ")){
    chars.add(tempStr);
    tempStr = "";
  }
  //INPUT WHATEVER YOU WANT FOR PUNCTATION WISE
  else if(cha.equals("!") || cha.equals(".")){
    chars.add(cha);
  }
  else{
    tempStr = tempStr + cha;
  }
}
chars.add(str.substring(str.lastIndexOf(" "));

那? 假定句子中每个单词都有空格,则应添加每个单词。对于!和。,您也必须对此进行检查。非常简单。