2013-12-06 2 views
1

Здесь у меня странная проблема, я пытаюсь реплицировать поведение, обнаруженное в powerbuilder, на C#.RegEx, чтобы найти строку, содержащую ряд строк чисел

Вот выбор саз в PowerBuilder

CHOOSE CASE ls_char 
    CASE "_" 
     ls_char = "-" 
    CASE "0" to "9" 
     MESSAGEBOX("DIGIT") 
END CHOOSE 

Теперь здесь встает вопрос: ls_char может быть строкой или символ, но все еще PowerBuilder находит, если это эквивалентное числовое значение находится между «0» и " 9" . Мы даже попробовали его, указав «0» на «900» и давая ls_char = «300», и он выдает сообщение.

Любые указания относительно наличия некоторого регулярного выражения для достижения этого или любого другого решения были бы весьма признательны.

+0

Вы можете попробовать регулярное выражение: '[0-9-]' – anubhava

+1

ничего общего с регулярным выражением (по крайней мере, регулярное выражение не имеет ничего общего с PowerBuilder ВЫБЕРИТЕ заявление). –

+0

ls_char предлагает отношение к char, который является типом данных одного символа. Вы уверены, что эта функция предназначена для того, чтобы значение ls_char было больше одного символа? Если это предназначено для одного символа, этот скрипт будет иметь больше смысла. (Подсказка: «1ABC» будет бросать «DIGIT», что не имеет смысла.) – Terry

ответ

0

В PowerScript CHOOSE утверждение не сравнить «... эквивалентное числовое значение ...», он просто сравнивает объекты, как они (в данном случае строки, без дальнейшей обработки). «9» больше, чем «0», поскольку «999» больше, чем «000» (вы можете попробовать «11» меньше, чем «2»).

Из PowerScript reference manual документации для expressionlist параметра CASE вы можете увидеть TO пункта принимает только значение, преобразование обычно делается из testexpression типа для expressionlist типа (ов), а не наоборот. Это означает, что если вы предоставите строки, то это будет сравнивать строки вместо чисел!

Существует не эквивалент CHOOSE в C# и switch заявление не может быть использован как то (вы можете его найти, например, в VB.NET для Select заявления). Обходной путь заключается в использовании if вместо:

string text = ls_char.ToString(); 
if (text == "_") 
    ls_char = "-"; 
else if (text >= "0" && text <= "9") 
    MessageBox.Show("Digit"); 

Для сравнения чисел, что вам нужно сделать, это предоставить номера в CASE блоков:

CHOOSE CASE long(ls_char) 
    CASE 0 TO 5 
     MESSAGEBOX("SMALLER") 
    CASE 6 TO 9 
     MESSAGEBOX("SMALL") 
END CHOOSE 

В этом случае ls_char (все, что его тип) преобразуется в число, а затем сравнивается, чтобы проверить, находится ли он в запрошенном диапазоне. Примерно в C# это эквивалентно следующему:

int number = Convert.ToInt32(ls_char); 
if (number >= 0 && number <= 5) 
    MessageBox.Show("Smaller"); 
else if (number >= 6 && number <= 9) 
    MessageBox.Show("Small"); 
+0

Вы пробовали? При условии, что ls_char является типом char, используя его в числовом 'select case', дает ошибку компиляции' C0011: Несовместимые типы в выражении: long, character' – Seki

+0

@Seki спасибо, написал прямо здесь и забыл преобразование. Исправлена. –

+0

Спасибо большое Adriano, – user3074622

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