例如,我有一個字串,
String s = "這是一個字串,需要在每 n 個單詞后拆分";
假設我必須在輸出應該是每 5 個單詞之后分割這個字串,
Arraylist stringArr = ["This is a String which", "needs to be split after", "every n words"]
如何做到這一點并將其存盤在java中的陣列中
uj5u.com熱心網友回復:
雖然 Java 沒有內置的方法來做到這一點,但使用 Java 的標準正則運算式很容易做到。
我下面的示例試圖清楚,而不是試圖成為“最佳”方式。
它基于查找由五個“單詞”組成的組,后跟一個空格,基于以下正則運算式([a-zA-Z] ){5}):
?[a-zA-Z] 查找任何字母,重復 ( )
? 后跟一個空格
?(...)分組
?{5}正好 5 次
您可能需要除字母之外的其他內容,并且您可能希望允許多個空格或任何空格,而不僅僅是空格,因此在示例的后面我將正則運算式更改為(\\S \\s ){5}where\S表示任何非空格并\s表示任何空格。
這首先通過方法中的程序,main沿途顯示輸出,我希望能清楚地說明發生了什么;然后展示了如何將這個程序變成一種方法。
我創建了一個方法,它將一行拆分為n 個單詞的組,然后呼叫它以每隔 5 個單詞拆分一次字串,然后再將其拆分為每 3 個單詞。
這里是:
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LineSplitterExample
{
public static void main(String[] args)
{
String s = "This is a String which needs to be split after every n words";
//Pattern p = Pattern.compile("([a-zA-Z] ){5}");
Pattern p = Pattern.compile("(\\S ){5}");
Matcher m = p.matcher(s);
int last = 0;
List<String> collected = new ArrayList<>();
while (m.find()) {
System.out.println("Group Count = " m.groupCount());
for (int i=0; i<m.groupCount(); i ) {
final String found = m.group(i);
System.out.printf("Group %d: %s%n", i, found);
collected.add(found);
// keep track of where the last group ended
last = m.end();
System.out.println("'m.end()' is " last);
}
}
// collect the final part of the string after the last group
String tail = s.substring(last);
System.out.println(tail);
collected.add(tail);
String[] result = collected.toArray(new String[0]);
System.out.println("result:");
for (int n=0; n<result.length; n ) {
System.out.printf("-: %s%n", n, result[n]);
}
// Put a little space after the output
System.out.println("\n");
// Now use the methods...
String[] byFive = splitByWords(s, 5);
displayArray(byFive);
String[] byThree = splitByWords(s, 3);
displayArray(byThree);
}
private static String[] splitByWords(final String s, final int n)
{
//final Pattern p = Pattern.compile("([a-zA-Z] ){" n "}");
final Pattern p = Pattern.compile("(\\S \\s ){" n "}");
final Matcher m = p.matcher(s);
List<String> collected = new ArrayList<>();
int last = 0;
while (m.find()) {
for (int i=0; i<m.groupCount(); i ) {
collected.add(m.group(i));
last = m.end();
}
}
collected.add(s.substring(last));
return collected.toArray(new String[0]);
}
private static void displayArray(final String[] array)
{
System.out.println("Array:");
for (int i=0; i<array.length; i ) {
System.out.printf("-: %s%n", i, array[i]);
}
}
}
我通過運行得到的輸出是:
Group Count = 1
Group 0: This is a String which
'm.end()' is 23
Group Count = 1
Group 0: needs to be split after
'm.end()' is 47
every n words
result:
0: This is a String which
1: needs to be split after
2: every n words
Array:
0: This is a String which
1: needs to be split after
2: every n words
Array:
0: This is a
1: String which needs
2: to be split
3: after every n
4: words
uj5u.com熱心網友回復:
您可以結合使用replaceAll和split
S{N}- 匹配N迭代S()- 正則運算式捕獲組$1- 對捕獲的組的反向參考
用出現的單詞替換每個出現的N單詞,然后加上一個特殊的分隔符(在這種情況下###)。然后在該分隔符上拆分。
public static String[] splitNWords(String s, int count) {
String delim = "((?:\\w \\s ){" count "})";
return s.replaceAll(delim, "$1###").split("###");
}
演示
String s = "This is a String which needs to be split after every n words";
for (int i = 1; i < 5; i ) {
String[] arr = splitNWords(s, i);
System.out.println("Splitting on " i " words.");
for (String st : arr) {
System.out.println(st);
}
System.out.println();
}
印刷
Splitting on 1 words.
This
is
a
String
which
needs
to
be
split
after
every
n
words
Splitting on 2 words.
This is
a String
which needs
to be
split after
every n
words
Splitting on 3 words.
This is a
String which needs
to be split
after every n
words
Splitting on 4 words.
This is a String
which needs to be
split after every n
words
uj5u.com熱心網友回復:
我不認為每 n 個單詞都有一個拆分。您需要指定一個模式,例如空格。例如,您可以拆分每個空白,然后在創建的陣列上進行迭代,并使用您想要的單詞數量制作另一個。
問候
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/459664.html
標籤:爪哇
上一篇:在使用子字串列印字符模式時,為什么我被初始化為1而不是0?
下一篇:多個AWSIoT設備
