我正在编写一个执行分隔符检查的程序。当用户输入诸如
之类的表达式时12+{2*[3*(24+45)+5]}
我需要检查分隔符是否匹配(类似于java编译器在表达式中检查的内容)。
我知道这可以通过大量if
/ else if
语句来完成,但我记得使用正则表达式来表示字符串,例如:
if(s.matches("[abc]+")
System.out.print(s);
但这对角色不起作用。如果我能写出类似于上面的表达式,那就太好了:
for(byte i = 0; i < aString.length(); i++)
{
if(aString.charAt(i).matches("[({[]})]+") // maybe '[]' is a problem
stack.push(aString.charAt(i));
}
字符是否存在这样的方法?我该怎么办?
答案 0 :(得分:2)
您可以维护一个List<Character>
来保持&#34;分隔符&#34;然后对字符串中的每个字符运行list.contains()
以确定它是否是有效的分隔符 - 这比任务的正则表达式更高效。您可能希望使用String
作为循环变量重新考虑在byte
上进行循环;这对你来说可能并不总是很好。对于一个简单的字符串(除了BMP之外没有花哨的Unicode字符),您可以使用for (char ch : aString.toCharArray()) {...}
循环它。
答案 1 :(得分:2)
我想说一个解决方法是使用Stack并在每个输入字符串处重新开始。
{, [, (
时,将推入堆栈。}, ], )
时,弹出来自堆栈。false
。完成搜索后,检查是否有空堆栈并返回true
或false
Stack Example: Delimiter Matching
如果您缺少分隔符匹配,则使用Stack的此示例将仅返回false
。
import java.util.Stack;
class BracketChecker {
private String input;
public BracketChecker(String in) {
input = in;
}
public void check() {
Stack<Character> theStack = new Stack<Character>();
for (int j = 0; j < input.length(); j++) {
char ch = input.charAt(j);
switch (ch) {
case '{':
case '[':
case '(':
theStack.push(ch);
break;
case '}':
case ']':
case ')':
if (!theStack.isEmpty()) {
char chx = theStack.pop();
if ((ch == '}' && chx != '{') ||
(ch == ']' && chx != '[') ||
(ch == ')' && chx != '('))
System.out.println("Error: " + ch + " at " + j);
} else
System.out.println("Error: " + ch + " at " + j);
break;
default:
break;
}
}
if (!theStack.isEmpty()){
System.out.println("Error: missing right delimiter");
}
}
}
class delimTest {
public static void main(String[] args) {
String input = "12+{2*[3*(24+45)+5}";
BracketChecker theChecker = new BracketChecker(input);
theChecker.check();
}
}