62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.Scanner;
import java.util.Stack;
public class GetBracket
{
//左、右括号常量
private static final char LEFTBRACKET = '(';
private static final char RIGHTBRACKET = ')';
//第N对括号
private static final int TARGETNUM = 3;
public static void main(String[] args)
{
//键盘输入字符串
System.out.print("请输入待测试的字符串:");
Scanner sc = new Scanner(System.in);
String testStr = sc.nextLine();
//不为空,则进行处理,截取字符串
if (null == testStr || testStr.length() <= 0)
{
System.out.println("输入的字符串为空。");
return;
}
//转换为数组处理
char[] cArr = testStr.toCharArray();
//校验括号匹配性以及是否达到目标数
if (!isAllowed(cArr))
{
return;
}
//截取括号中的字符串
String targetStr = getStrFromBracket(cArr);
if (null != targetStr)
{
System.out.println("截取目标括号中的字符串内容为:" + targetStr);
}
}
/**
* 入参的字符串括号要匹配,个数要超过TARGETNUM值
*/
private static boolean isAllowed(char[] arr)
{
//若长度小于TARGETNUM,则括号数不够
if (null == arr || arr.length < TARGETNUM)
{
System.out.println("入参字符串不合法!");
return false;
}
//左括号计数器
int counter = 0;
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < arr.length; i++)
{
char k = arr[i];
switch (k)
{
//左括号,计数器+1
case LEFTBRACKET:
{
counter++;
stack.add(k);
break;
}
//右括号,找出相应的左括号出栈
case RIGHTBRACKET:
{
if (stack.isEmpty())
{
System.out.println("入参字符串不合法!");
return false;
}
stack.pop();
break;
}
default:
}
}
//若匹配括号数少于目标值或者括号不匹配
if (counter < TARGETNUM || !stack.isEmpty())
{
System.out.println("入参字符串不合法!");
return false;
}
return true;
}
/**
* 从合法的字符串数组中,找到指定的字符串
* @param cArr
* @return
* @see
*/
private static String getStrFromBracket(char[] cArr)
{
//左右下标初始化
//int left = 0;
//int right = 0;
//成对括号计数器
int counter = 0;
int i = 0;
//找到第N个左括号
for (; i < cArr.length && counter < TARGETNUM; i++)
{
if (LEFTBRACKET == cArr[i])
{
counter++;
}
}
//从目标左括号开始截取字符串
int leftNum = 0;
StringBuilder sb = new StringBuilder();
outer: for (; i < cArr.length; i++)
{
if (cArr[i] == RIGHTBRACKET)
{
//左右括号数匹配了
--leftNum;
if (leftNum < 0)
{
break outer;
}
}
else if (cArr[i] == LEFTBRACKET)
{
//多余的左括号也要加入到String中,这里不需要break操作
++leftNum;
}
sb.append(cArr[i]);
}
return sb.toString();
}
}
String test = "(ad(d(d(adb)de)d)d)";
int n = 3;
for (int i = 0; i < n; i++) {
int first = test.indexOf("(");
int last = test.lastIndexOf(")");
test = test.substring(first + 1, last);
}
System.out.println(test);
都是基础的字符串的方法