60

我需要我的 Java 程序来获取如下字符串:

"This is a sample sentence."

并将其转换为字符串数组,例如:

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

没有句点或标点符号(最好)。顺便说一句,字符串输入总是一个句子。

有没有一种我没有看到的简单方法来做到这一点?还是我们真的需要大量搜索空格并从空格之间的区域(即单词)创建新字符串?

4

18 回答 18

79

String.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]", "");
}
于 2011-01-12T22:47:08.147 回答
31

现在,这可以通过使用split正则表达式来完成:

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

这将给出如下的话:{"this","is","a","sample","sentence", "s"}

\\W+匹配所有出现一次或多次的非字母字符。所以没有必要更换。您也可以检查其他模式。

于 2016-04-06T16:25:23.413 回答
14

您可以使用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;
}

测试:

public static void main(String[] args) {
    System.out.println(getWords("A PT CR M0RT BOUSG SABN NTE TR/GB/(G) = RAND(MIN(XXX, YY + ABC))"));
}

输出:

[A, PT, CR, M0RT, BOUSG, SABN, NTE, TR, GB, G, RAND, MIN, XXX, YY, ABC]
于 2014-11-03T12:38:10.110 回答
12

您也可以使用BreakIterator.getWordInstance.

于 2011-01-12T22:50:16.647 回答
7

你可以使用这个正则表达式来分割你的字符串

String l = "sofia, malgré tout aimait : la laitue et le choux !" <br/>
l.split("[[ ]*|[,]*|[\\.]*|[:]*|[/]*|[!]*|[?]*|[+]*]+");
于 2013-12-03T22:37:22.067 回答
7

尝试使用以下内容:

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

这将使用空间作为分割点在字符串数组的每个索引处创建一个子字符串。

于 2015-04-15T18:25:24.623 回答
5

我能想到的最简单和最好的答案是使用在 java 字符串上定义的以下方法 -

String[] split(String regex)

只需执行“This is a sample sentence”.split(" ")。因为它需要一个正则表达式,所以您也可以进行更复杂的拆分,包括删除不需要的标点符号和其他此类字符。

于 2011-01-12T22:47:41.787 回答
4

用于string.replace(".", "").replace(",", "").replace("?", "").replace("!","").split(' ')将您的代码拆分为一个没有句点、逗号、问号或感叹号的数组。您可以根据需要添加/删除任意数量的替换调用。

于 2011-01-12T22:49:26.757 回答
4

尝试这个:

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] + "\"");
}
于 2011-01-12T22:50:23.107 回答
2

我已经在某个地方发布了这个答案,我会再次在这里做。此版本不使用任何主要的内置方法。你得到了 char 数组,将其转换为字符串。希望能帮助到你!

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
        }
    }
    }

}
于 2014-08-24T20:54:42.777 回答
1

以下是一个代码片段,它将句子拆分为单词并给出它的计数。

 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());         
    }
    }

}
于 2014-03-14T15:38:00.510 回答
1

string.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();
    }
于 2013-01-14T14:04:56.810 回答
1

另一种方法是 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();
    }
}
于 2016-09-10T03:50:16.087 回答
0

这是一个没有花哨功能的简单 C++ 代码的解决方案,使用 DMA 分配一个动态字符串数组,并将数据放入数组中,直到找到一个开放空间。请参考下面的代码和评论。我希望它有所帮助。

#include<bits/stdc++.h>
using namespace std;

int main()
{

string data="hello there how are you"; // a_size=5, char count =23
//getline(cin,data); 
int count=0; // initialize a count to count total number of spaces in string.
int len=data.length();
for (int i = 0; i < (int)data.length(); ++i)
{
    if(data[i]==' ')
    {
        ++count;
    }
}
//declare a string array +1 greater than the size 
// num of space in string.
string* str = new string[count+1];

int i, start=0;
for (int index=0; index<count+1; ++index) // index array to increment index of string array and feed data.
{   string temp="";
    for ( i = start; i <len; ++i)
    {   
        if(data[i]!=' ') //increment temp stored word till you find a space.
        {
            temp=temp+data[i];
        }else{
            start=i+1; // increment i counter to next to the space
            break;
        }
    }str[index]=temp;
}


//print data 
for (int i = 0; i < count+1; ++i)
{
    cout<<str[i]<<" ";
}

    return 0;
}
于 2019-11-11T07:46:03.323 回答
0

这应该有帮助,

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

这将创建一个数组,其中元素为以“”分隔的字符串。

于 2020-12-02T07:20:21.683 回答
0

这里的大多数答案都将 String 转换为 String Array 作为问题。但通常我们使用 List ,所以更有用的是 -

String dummy = "This is a sample sentence.";
List<String> wordList= Arrays.asList(dummy.split(" "));
于 2019-03-06T22:14:15.850 回答
0

您可以使用简单的以下代码

String str= "This is a sample sentence.";
String[] words = str.split("[[ ]*|[//.]]");
for(int i=0;i<words.length;i++)
System.out.print(words[i]+" ");
于 2017-11-09T05:59:22.520 回答
0

尝试这个....

import java.util.Scanner;

public class test {
    public static void main(String[] args) {

        Scanner t = new Scanner(System.in);
        String x = t.nextLine();

        System.out.println(x);

        String[] starr = x.split(" ");

        System.out.println("reg no: "+ starr[0]);
        System.out.println("name: "+ starr[1]);
        System.out.println("district: "+ starr[2]);

    }
}
于 2021-09-01T17:03:03.073 回答