Преобразовать строку фразу в строку массив слов в Java

мне нужна моя программа Java, чтобы взять строку, как:

"This is a sample sentence."

и превратите его в строковый массив, например:

{"this","is","a","sample","sentence"}

нет периодов или пунктуации (предпочтительно). Кстати, строковый ввод-это всегда одно предложение.

есть простой способ сделать это, что я не вижу? Или нам действительно нужно много искать пробелы и создавать новые строки из областей между пробелами (которые являются словами)?

14 ответов


строку.split () будет делать большую часть того, что вы хотите. Затем вам может потребоваться цикл над словами, чтобы вытащить любую пунктуацию.

например:

String s = "This is a sample sentence.";
String[] words = s.split("\s+");
for (int i = 0; i < words.length; i++) {
    // You may want to check for a non-word character before blindly
    // performing a replacement
    // It may also be necessary to adjust the character class
    words[i] = words[i].replaceAll("[^\w]", "");
}

можно использовать BreakIterator.getWordInstance найти все слова в строке.

public static List<String> getWords(String text) {
    List<String> words = new ArrayList<String>();
    BreakIterator breakIterator = BreakIterator.getWordInstance();
    breakIterator.setText(text);
    int lastIndex = breakIterator.first();
    while (BreakIterator.DONE != lastIndex) {
        int firstIndex = lastIndex;
        lastIndex = breakIterator.next();
        if (lastIndex != BreakIterator.DONE && Character.isLetterOrDigit(text.charAt(firstIndex))) {
            words.add(text.substring(firstIndex, lastIndex));
        }
    }

    return words;
}

теперь, это может быть достигнуто только с split как это принимает regex:

String s = "This is a sample sentence with []s.";
String[] words = s.split("\W+");

это даст слова как: {"this","is","a","sample","sentence", "s"}

на \W+ будет соответствовать всем не алфавитных символов, происходящих один или несколько раз. Поэтому нет необходимости заменять. Вы также можете проверить другие шаблоны.


вы также можете использовать BreakIterator.getWordInstance.


вы можете просто разделить строку так, используя это обычный выражение

String l = "sofia, malgré tout aimait : la laitue et le choux !" <br/>
l.split("[[ ]*|[,]*|[\.]*|[:]*|[/]*|[!]*|[?]*|[+]*]+");

самый простой и лучший ответ, который я могу придумать, - использовать следующий метод, определенный в строке java -

String[] split(String regex)

и просто сделайте "это пример предложения".расщеплять.)" "( Поскольку для этого требуется регулярное выражение, вы также можете выполнять более сложные расщепления, которые могут включать удаление нежелательной пунктуации и других таких символов.


использовать string.replace(".", "").replace(",", "").replace("?", "").replace("!","").split(' ') чтобы разделить код на массив без точек, запятых, вопросительных или восклицательных знаков. Вы можете добавлять / удалять столько вызовов replace, сколько хотите.


попробуйте использовать следующие:

String str = "This is a simple sentence";
String[] strgs = str.split(" ");

это создаст подстроку в каждом индексе массива строк, используя пробел в качестве точки разделения.


попробуйте это:

String[] stringArray = Pattern.compile("ian").split(
"This is a sample sentence"
.replaceAll("[^\p{Alnum}]+", "") //this will remove all non alpha numeric chars
);

for (int j=0; i<stringArray .length; j++) {
  System.out.println(i + " \"" + stringArray [j] + "\"");
}

Ниже приведен фрагмент кода, который разбивает sentense на word и дает его количество.

 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;

 public class StringToword {
public static void main(String[] args) {
    String s="a a a A A";
    String[] splitedString=s.split(" ");
    Map m=new HashMap();
    int count=1;
    for(String s1 :splitedString){
         count=m.containsKey(s1)?count+1:1;
          m.put(s1, count);
        }
    Iterator<StringToword> itr=m.entrySet().iterator();
    while(itr.hasNext()){
        System.out.println(itr.next());         
    }
    }

}

строка.replaceAll () неправильно работает с языковым стандартом, отличным от предопределенного. По крайней мере, в jdk7u10.

в этом примере создается словарь слов из текстового файла с помощью Windows Cyrillic charset CP1251

    public static void main (String[] args) {
    String fileName = "Tolstoy_VoinaMir.txt";
    try {
        List<String> lines = Files.readAllLines(Paths.get(fileName),
                                                Charset.forName("CP1251"));
        Set<String> words = new TreeSet<>();
        for (String s: lines ) {
            for (String w : s.split("\s+")) {
                w = w.replaceAll("\p{Punct}","");
                words.add(w);
            }
        }
        for (String w: words) {
            System.out.println(w);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

Я уже разместил этот ответ где-то, я сделаю это здесь снова. Эта версия не использует какой-либо основной встроенный метод. у вас есть массив символов, преобразуйте его в строку. надеюсь, что это помогает!

import java.util.Scanner;

public class SentenceToWord 
{
    public static int getNumberOfWords(String sentence)
    {
        int counter=0;
        for(int i=0;i<sentence.length();i++)
        {
            if(sentence.charAt(i)==' ')
            counter++;
        }
        return counter+1;
    }

    public static char[] getSubString(String sentence,int start,int end) //method to give substring, replacement of String.substring() 
    {
        int counter=0;
        char charArrayToReturn[]=new char[end-start];
        for(int i=start;i<end;i++)
        {
            charArrayToReturn[counter++]=sentence.charAt(i);
        }
        return charArrayToReturn;
    }

    public static char[][] getWordsFromString(String sentence)
    {
        int wordsCounter=0;
        int spaceIndex=0;
        int length=sentence.length();
        char wordsArray[][]=new char[getNumberOfWords(sentence)][]; 
        for(int i=0;i<length;i++)
        {
            if(sentence.charAt(i)==' ' || i+1==length)
            {
            wordsArray[wordsCounter++]=getSubString(sentence, spaceIndex,i+1); //get each word as substring
            spaceIndex=i+1; //increment space index
            }
        }
        return  wordsArray; //return the 2 dimensional char array
    }


    public static void main(String[] args) 
    {
    System.out.println("Please enter the String");
    Scanner input=new Scanner(System.in);
    String userInput=input.nextLine().trim();
    int numOfWords=getNumberOfWords(userInput);
    char words[][]=new char[numOfWords+1][];
    words=getWordsFromString(userInput);
    System.out.println("Total number of words found in the String is "+(numOfWords));
    for(int i=0;i<numOfWords;i++)
    {
        System.out.println(" ");
        for(int j=0;j<words[i].length;j++)
        {
        System.out.print(words[i][j]);//print out each char one by one
        }
    }
    }

}

другой способ сделать это StringTokenizer. пример: -

 public static void main(String[] args) {

    String str = "This is a sample string";
    StringTokenizer st = new StringTokenizer(str," ");
    String starr[]=new String[st.countTokens()];
    while (st.hasMoreElements()) {
        starr[i++]=st.nextElement();
    }
}

вы можете использовать простой, следующий код

String str= "This is a sample sentence.";
String[] words = str.split("[[ ]*|[//.]]");
for(int i=0;i<words.length;i++)
System.out.print(words[i]+" ");