我的字符串例如是:
(我的Na(#me是Sameer)
我希望输出在括号中分割为:
(
我
钠(#me
是
萨米尔
)
答案 0 :(得分:1)
我会通过使用任何空格字符作为分隔符(即" \t\r\n"
)来启动。
String challenge = "(My Na(me is Sameer)";
String[] parts = challenge.split("\\s*");
但是多个连续的空格也被处理为1个分隔符。只要有2个连续的空格,你就不希望有一个空字符串(即""
)。
接下来,我将把所有内容都放在List
中。首先,因为我的印象是,实际上你不只是想打印这个文本。您可能希望在代码中的其他位置使用它们,例如将它们作为参数传递给另一个方法。
有多种列表类型可供选择(例如ArrayList
)。在这种情况下,我需要对列表的内容进行一次修改。我打算分割元素,如果它们以括号开头或结尾 (
或)
。出于这个原因,我正在使用LinkedList
。因为链表更有效,可以在列表中间插入元素。
List<String> partList = new LinkedList<>(Arrays.asList(parts));
所以我们走吧,让我们迭代所有元素。如果元素以括号开头,则将其拆分为2个元素。对于以括号结尾相同的元素。
for (int i = 0; i < partList.size(); i++) {
String part = partList.get(i);
if (part.startsWith("(")) {
partList.set(i, part.substring(1));
partList.add(i, "(");
} else if (part.endsWith(")")) {
partList.set(i, part.substring(0, part.length() - 1));
partList.add(i + 1, ")");
i++;
}
}
现在,请注意我在添加")"
元素时递增索引,这是避免无限循环所必需的。
此方法存在缺点。如果您有一个如下所示的短语:"(((mytext)))"
它可能无法满足您的期望。但我认为这超出了你的问题的范围。它可以通过添加更多代码来解决,但我不想让它太复杂。
最后我打印了所有内容。
for (String part : partList) {
System.out.println(part);
}
为了完成。以下实现稍微复杂一些,但也解决了极端情况。
String challenge = "((this is a) rea(lly go)od (((challenge))))";
String[] parts = challenge.split("\\s");
List<String> partList = new LinkedList<>(Arrays.asList(parts));
for (int i = 0; i < partList.size(); i++) {
String part = partList.get(i);
// avoid eternal loops
if (part.length() == 1) continue;
if (part.startsWith("(")) {
partList.set(i, part.substring(1));
partList.add(i, "(");
// will reprocess, because the part is automatically shifted 1 position in the list.
}
else if (part.endsWith(")")) {
partList.set(i, part.substring(0, part.length() - 1));
partList.add(i+1, ")");
// reprocess this element, there could be more ")" braces.
i--;
}
}
答案 1 :(得分:0)
如果你正在寻求帮助,你应该想出你到目前为止所尝试的内容。在这里你可以做以下事情。
答案 2 :(得分:0)
如果括号仅出现在句子的开头和结尾,则首先使用子字符串然后使用空格将其拆分。
如果括号可以出现在句子中间的任何位置(单词的开头或结尾),那么首先根据空格填充,然后遍历每个单词并根据括号的开头和结尾再次溢出字。您可以使用以下代码(当然,这可以进一步增强)
String test = "(My Na(me (is) Jack)";
String[] splitWords = test.split(" ");
for (String word : splitWords) {
int size = word.length();
if (word.startsWith("(") && word.endsWith(")")) {
System.out.println("(");
System.out.println(word.substring(1, size - 1));
System.out.println(")");
} else if (word.startsWith("(") && !word.endsWith(")")) {
System.out.println("(");
System.out.println(word.substring(1, size ));
} else if (!word.startsWith("(") && word.endsWith(")")) {
System.out.println(word.substring(0, size - 1));
System.out.println(")");
} else {
System.out.println(word);
}
}
这将产生如下输出。
(
My
Na(me
(
is
)
Jack
)
答案 3 :(得分:0)
此正则表达式仅匹配您想要的括号:\B[)(]\b|\b[)(]\B|\B[)(]\B
这里是一个Java字符串:
"\\B[)(]\\b|\\b[)(]\\B|\\B[)(]\\B"
\b
匹配字边界
\B
匹配非字边界