我正在考虑使用Java中的正则表达式来验证由字母表作为操作数和+-*/$作为运算符的中缀表示法[例如: A+B-(C/D)$(E+F) ]。 有没有更好的方法? 有没有我可以使用的正则表达式模式?
I am thinking of validating an infix notation which consists of alphabets as operands and +-*/$ as operators [eg: A+B-(C/D)$(E+F)] using regex in Java. Is there any better way? Is there any regex pattern which I can use?
最满意答案
我不熟悉中infix的语言语法,但你当然可以进行第一遍验证检查,它只是验证字符串中的所有字符是否有效(即可接受的字符= AZ , + , - , * , / , $ , (和) )。 这是一个Java程序,它检查有效字符,还包括一个检查不平衡(可能是嵌套)括号的函数:
import java.util.regex.*; public class TEST { public static void main(String[] args) { String s = "A+B-(C/D)$(E+F)"; Pattern regex = Pattern.compile( "# Verify that a string contains only specified characters.\n" + "^ # Anchor to start of string\n" + "[A-Z+\\-*/$()]+ # Match one or more valid characters\n" + "$ # Anchor to end of string\n", Pattern.COMMENTS); Matcher m = regex.matcher(s); if (m.find()) { System.out.print("OK: String has only valid characters.\n"); } else { System.out.print("ERROR: String has invalid characters.\n"); } // Verify the string contains only balanced parentheses. if (checkParens(s)) { System.out.print("OK: String has no unbalanced parentheses.\n"); } else { System.out.print("ERROR: String has unbalanced parentheses.\n"); } } // Function checks is string contains any unbalanced parentheses. public static Boolean checkParens(String s) { Pattern regex = Pattern.compile("\\(([^()]*)\\)"); Matcher m = regex.matcher(s); // Loop removes matching nested parentheses from inside out. while (m.find()) { s = m.replaceFirst(m.group(1)); m.reset(s); } regex = Pattern.compile("[()]"); m = regex.matcher(s); // Check if there are any erroneous parentheses left over. if (m.find()) { return false; // String has unbalanced parens. } return true; // String has balanced parens. } }这不会验证语法,但可以作为第一个测试来过滤掉明显不好的字符串。
I am not familiar with the language syntax of infix, but you can certainly do a first pass validation check which simply verifies that all of the characters in the string are valid (i.e. acceptable characters = A-Z, +, -, *, /, $, ( and )). Here is a Java program which checks for valid characters and also includes a function which checks for unbalanced (possibly nested) parentheses:
import java.util.regex.*; public class TEST { public static void main(String[] args) { String s = "A+B-(C/D)$(E+F)"; Pattern regex = Pattern.compile( "# Verify that a string contains only specified characters.\n" + "^ # Anchor to start of string\n" + "[A-Z+\\-*/$()]+ # Match one or more valid characters\n" + "$ # Anchor to end of string\n", Pattern.COMMENTS); Matcher m = regex.matcher(s); if (m.find()) { System.out.print("OK: String has only valid characters.\n"); } else { System.out.print("ERROR: String has invalid characters.\n"); } // Verify the string contains only balanced parentheses. if (checkParens(s)) { System.out.print("OK: String has no unbalanced parentheses.\n"); } else { System.out.print("ERROR: String has unbalanced parentheses.\n"); } } // Function checks is string contains any unbalanced parentheses. public static Boolean checkParens(String s) { Pattern regex = Pattern.compile("\\(([^()]*)\\)"); Matcher m = regex.matcher(s); // Loop removes matching nested parentheses from inside out. while (m.find()) { s = m.replaceFirst(m.group(1)); m.reset(s); } regex = Pattern.compile("[()]"); m = regex.matcher(s); // Check if there are any erroneous parentheses left over. if (m.find()) { return false; // String has unbalanced parens. } return true; // String has balanced parens. } }This does not validate the grammar, but may be useful as a first test to filter out obviously bad strings.
更多推荐
发布评论