java字符串“(a|b)+c” 匹配----出入栈知识
有需要用到字符串匹配的项目,非常需要这个方法。
使用场景: 当你遇到 (a|b)+c 需要转换成 ac+bc的时候。
解决思路:
1.新new一个stack,对传入的字符串进行字符拆分,使用charAt()
可一个个拆分。例如 “(广州|天河区)+炒作” 拆分出---->>'(','广','州','|',‘天’,'河','区',')','+','炒','作'
2.拆分之后,对字符进行处理,当遇到'(',')'
时不入栈,其他情况按顺序入栈。
3.新new一个list,泛型是String
,目的是将字符串中的字符入list,将一个括号内的内容加到list数组中。如 广州|天河区|上社
为第一个list,第二个list是造谣|炒作
,第三个丑闻|事故
…
4.对上面的list,进行循环匹配拼凑。其中包含与列表 ,合列表
代码部分:
package utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 基于关键词的检索设置
* 传入搜索参数的设置
*/
public class StringUtil {
public static void main(String[] args) {
//例子
List<String> list = parse("(广州|天河区|上社)+((造谣|炒作)+(丑闻|事故))+报道");
for (String str : list) {
System.out.println(str);
}
}
/**
* 传入“(XX+XX)| XX”格式的字符串
*
* @param formula
* @return
*/
public static List<String> parse(String formula) {
Stack<String> stack = new Stack<String>();
int i = 0;
for (i = 0; i < formula.length(); i++) {
Character c = formula.charAt(i);
if (c == '(') {
stack.push("(");
} else if (c == ')') {
stack.pop();
} else if (c == '+') {
if (stack.size() == 0)
break;
} else if (c == '|') {
if (stack.size() == 0)
break;
}
}
if (i != 0 && i < formula.length()) {
String b = formula.substring(0, i).trim();
//如果有括号,去除括号
if (b != null && b != "" && b.charAt(0) == '(' && b.charAt(b.length() - 1) == ')') {
b = b.substring(1, b.length() - 1);
}
List<String> formatBefore = new ArrayList<String>();
formatBefore = parse(b);
String e = formula.substring(i + 1).trim();
List<String> formatLast = new ArrayList<String>();
formatLast = parse(e);
return operation(formatBefore, formatLast, formula.charAt(i));
} else {
String b = formula;
//如果有括号,去除括号
if (b != null && b != "" && b.charAt(0) == '(' && b.charAt(b.length() - 1) == ')') {
b = b.substring(1, b.length() - 1).trim();
return parse(b);
} else {
List<String> list = new ArrayList<String>();
list.add(formula);
return list;
}
}
}
/**
* 两个列表的操作
*
* @param b 前一个列表
* @param e 后一个列表
* @param oper 操作符
* @return
*/
public static List<String> operation(List<String> b, List<String> e, char oper) {
if (oper == '+') {
return listAnd(b, e);
} else {
return listOr(b, e);
}
}
//与列表
public static List<String> listAnd(List<String> b, List<String> e) {
List<String> list = new ArrayList<String>();
for (String bstr : b) {
for (String estr : e) {
list.add(bstr + "+" + estr);
}
}
return list;
}
//合并列表
public static List<String> listOr(List<String> b, List<String> e) {
List<String> list = new ArrayList<String>();
for (String bstr : b) {
list.add(bstr);
}
for (String estr : e) {
list.add(estr);
}
return list;
}
}
效果展示: