0

我正在制作infix evaluator其中的合法标记包括:+、-、*、/、(、)、非负整数以及任何以一个或多个字母开头并以一个或多个数字结尾的字符串。

我试图找到最有效的方法来确定给定的字符串是否以一个或多个字母开头并以一个或多个数字结尾。抓住的是alphabetical characaters must come before the numerical values(例如X1,XX1,X11)。但是,如果String中包含类似于1X、X1X、X#1的东西,那么输入是无效的。我知道这包含了很多可能性,我希望有一种方法可以简化它。

到目前为止,我已经研究了诸如 String 、 和函数之类AnyStartsWith方法EndsWith。我只是觉得有太多的可能性可以将其简化为一个简短的 lambda 表达式或单行。事实上,由于我们不一定能保证任何类型的输入,因此似乎必须检查所有 N 个字符以确保满足这些条件。

下面是我到目前为止的代码。此代码包括根据正则表达式分解输入字符串@"([()+*/-])"

    public static string[] parseString(String infixExp)
    {
        /* In a legal expression, the only possible tokens are (, ), 
         * +, -, *, /, non-negative integers, and strings that begin 
         * with one or more letters and end with one or more digits.
         */

        // Ignore all whitespace within the expression.
        infixExp = Regex.Replace(infixExp, @"\s+", String.Empty);

        // Seperate the expression based on the tokens (, ), +, -, 
        // *, /, and ignore any of the empty Strings that are added
        // due to duplicates.
        string[] substrings = Regex.Split(infixExp, @"([()+*/-])").Where(s => s != String.Empty).ToArray();

        // Return the resulting substrings array such that it
        // can be processed by the Evaluate function.
        return substrings;
    }

如果您有任何建议性方法和/或任何参考资料可以解决此问题,请随意!

4

2 回答 2

0

你可以试试

char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray();
char[] numbers = "1234567890".ToCharArray();
foreach(string s in infixExp.Split(' '))
{
  if(letters.Contains(s[0]))
  {
    //do stuff
  }
  if(numbers.Contains(s[s.Length-1]))
  {
   //do more stuff
  }
}
于 2013-09-08T01:59:29.203 回答
0

要确定给定字符串是否以一个或多个字母开头并以一个或多个数字结尾,您可以使用类中的静态IsMatch函数Regex

Regex.IsMatch: 
Indicates whether the regular expression finds a match in the input string.

然后,您可以将正则表达式^[A-Z]+[0-9]+$作为方法的第二个参数提供。同样,如果您希望忽略大小写,则可以提供 RegexOptionsRegexOptions.IgnoreCase

这将确保字符串输入至少以一个字符开头,后跟至少一位数字(例如,XX1、X3、XZ9)。

更多关于正则表达式语言的信息可以通过这个链接找到。我希望这对将来的任何人都有帮助!

于 2013-09-08T20:28:25.197 回答