我有一个程序以逻辑表达式的形式接受用户输入(例如:(p =>(r || q)))并将字符串分成由括号定义的子串。我正在使用模式和匹配器
因此,例如用户输入:
的((对|| Q)=> R)。
我想获得2个子串:
点||常见
和
的(P || Q)=>:R
但是我只能得到这个:
(p || q
以下是我正在使用的代码
Scanner scanner = new Scanner(System.in);
System.out.println("Enter formula: ");
String formula = scanner.next();
Pattern pattern = Pattern.compile("\\((.*?)\\)");
Matcher matcher = pattern.matcher(formula);
while(matcher.find())
{
String s = matcher.group(1);
System.out.println(s);
}
所以我需要一种方法,程序找到该字符串中的所有子字符串。
答案 0 :(得分:2)
您无法使用正则表达式执行此操作。
因为使用括号表示您想要做的事情超出了正则表达式的功能。正则表达式描述了Chomsky-3语法,它不具有括号结构。支架结构以Chomsky-2语法提供。因此,您必须使用解析规则定义相应的语法。一个可以帮助您实现目标的好图书馆是ANTLR。
答案 1 :(得分:2)
正如我在评论中所说,正则表达式根本不能处理嵌套括号。但是,如果您有一个堆栈,手动解析它们非常简单。以下是一些示例代码:
public static void main(String[] args) throws InterruptedException {
findSubExpressions("((p||q)=>r)");
}
private static void findSubExpressions(String input) {
Deque<Integer> startingBrackets = new LinkedList<Integer>();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == '(') {
startingBrackets.push(i);
} else if (c == ')') {
int correspondingStart = startingBrackets.pop();
logSubExpression(input.substring(correspondingStart+1, i));
}
}
}
private static void logSubExpression(String subExpression) {
System.out.println(subExpression);
}