我需要问一下在Java字符串中删除括号和文本的问题。例如,我有
String str = "I am a new (Software) Engineer"现在的问题是,如何删除子字符串“(软件)”而不使用
str.replace("(software)", "")因为可能在下一个字符串,我会得到“我是一个新的(电气)工程师”或“(机械的)”或类似的东西。
那么我怎么做呢,我想一种方法是得到"(“和")”的索引,并使用这个索引来删除/替换它们,但是我希望有一些更短的方法来做到这一点。
发布于 2013-10-02 11:48:23
使用regex匹配括号中的任何内容:
str = str.replaceAll("\\(.*?\\) ?", "");请注意,括号必须转义,转义字符\本身必须在字符串中转义,因此出现双反斜杠。
术语.*?是一个不情愿的匹配,这意味着它不会一直跳到最后一个括号,以防输入中有两个括号--如果使用.*,"a (foo) b (bar) c“将变成"a c”,因为它将消耗从第一个开放括号到最后一个近括号的所有内容。
我在末尾添加了一个可选的空格,这样一旦删除中间项,就不会留下两个相邻的空格。
发布于 2013-10-02 12:13:07
实际上,最有效和最简单的方法是遍历整个字符串并检查括号。只需要一次扫描。
您还必须跟踪打开和关闭括号的数量,以确保算法对于像outside (a text (in another) parenthesis) outside again这样的句子是正确的,这将导致outside outside again。
一种代码,它或多或少地做到了这一点。
public class RemoveParenthesis {
public static void main(String[] args) {
int open = 0;
int closed = 0;
boolean changed = true;
int startIndex = 0, openIndex = -1, closeIndex = -1;
String text = "outside (a text (in another) parenthesis) outside again";
System.out.println("before: " + text);
while (changed) {
changed = false;
for (int a = startIndex; a < text.length(); a++) {
if (text.charAt(a) == '(') {
open++;
if (open == 1) {
openIndex = a;
}
} else if (text.charAt(a) == ')') {
closed++;
if (open == closed) {
closeIndex = a;
text = text.substring(0, openIndex)
+ text.substring(closeIndex + 1);
changed = true;
break;
}
} else {
if (open == 0)
startIndex++;
continue;
}
}
}
System.out.println("after: " + text);
}
}发布于 2018-08-28 11:35:49
public static String removeBracketContents(String response) {
char ch;
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<Character>();
System.out.println("before removeBracketContents: " + response);
for (int i = 0; i < response.length(); i++) {
ch = response.charAt(i);
switch (ch) {
case '(':
stack.push(new Character(ch));
break;
case ')':
if (stack.isEmpty())
return response;
else
stack.pop();
break;
default:
if (stack.isEmpty())
sb.append(ch);
break;
}
}
System.out.println("after removeBracketContents: " + sb.toString());
if (!stack.isEmpty()) {
System.out.println("Missing ) at end");
System.out.println("after removeBracketContents: " + response);
return response;
} else {
System.out.println("after removeBracketContents: " + sb.toString());
return sb.toString();
}
}https://stackoverflow.com/questions/19136161
复制相似问题