2013-09-08 5 views
0

Я делаю infix evaluator, в котором легальные маркеры включают в себя: +, -, *, /, (,), целые неотрицательные числа и любую строку, которая начинается с одной или несколькими буквами и заканчивается одной или несколькими цифрами.Определение, если строка начинается с алфавитного символа и содержит числовые цифры

Я пытаюсь найти наиболее эффективный способ определить, начинается ли заданная строка с одной или нескольких букв и заканчивается одной или несколькими цифрами. Уловкой является то, что alphabetical characaters must come before the numerical values (например, X1, XX1, X11). Однако, если строка содержит что-то похожее на 1X, X1X, X # 1, тогда вход недействителен. Я знаю, что это множество возможностей, и я надеюсь, что есть способ его упростить.

До сих пор я исследовал методы, такие как String's Any, StartsWith и EndsWith. Я просто чувствую, что есть слишком много возможностей, чтобы упростить это в короткое лямбда-выражение или однострочный. На самом деле, поскольку нам не обязательно гарантирован какой-либо вход, кажется, что все N символов должны быть проверены, чтобы обеспечить выполнение этих условий.

Ниже приведен код, который у меня есть. Этот код включает в себя нарушение ввода вздернуть на основе RegularExpression @"([()+*/-])"

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; 
    } 

Если у вас есть какие-либо наводящие подходы и/или любые ссылки такие, что я мог бы решить эту проблему, пожалуйста, не стесняйтесь!

+2

Я действительно не понимаю, почему это должно быть так сложно. Не будет ли трюк Regex '^ [A-Z] + [0-9] + $'? – spender

+1

@spender или, возможно, даже '^ [a-zA-Z] + \\ d + $'. Из вопроса: «... определить, начинается ли заданная строка с одной или нескольких букв и заканчивается одной или несколькими цифрами». –

+0

@spender Я думаю, мне нужно посмотреть документацию Regex немного лучше, потому что это работало как шарм! Благодарю. – Jonathan

ответ

0

Чтобы определить, является ли данная строка начинается с одной или нескольких букв и заканчивается одним или более цифр, вы можете использовать статическую IsMatch функцию от Regex класса.

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

Затем вы можете поставить регулярное выражение ^[A-Z]+[0-9]+$ в качестве второго параметра метода. Аналогичным образом, если вы хотите проигнорировать регистр, вы можете поставить RegexOptions RegexOptions.IgnoreCase

Это гарантирует, что ввод строки начинается с по меньшей мере одного символа, за которым следует, по меньшей мере, одна цифра (например, XX1, X3, XZ9).

Дополнительную информацию о языке регулярных выражений можно найти здесь link. Надеюсь, это поможет любому в будущем!

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 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^