Мне нужна справка по синтаксическому анализу текста (регулярные выражения / C #) - PullRequest
1 голос
/ 01 мая 2011

Я мог бы немного помочь с правильными регулярными выражениями, чтобы разобрать следующую строку в 3 переменные. Часть с комментариями // TODO: - вот где мне нужна помощь с регулярными выражениями. Сейчас я только что назначил статическое значение, но мне нужно заменить его реальными регулярными выражениями, которые анализируют образец текста. Спасибо!

// This is what a sample text will look like.
var text = "Cashpay @username 55 This is a sample message";

// We need to parse the text into 3 variables.
// 1) username - the user the payment will go to.
// 2) amount - the amount the payment is for.
// 3) message - an optional message for the payment.
var username = "username"; // TODO: Get the username value from the text.
var amount = 55.00; // TODO: Get the amount from the text.
var message = "This is a sample message"; // TODO: Get the message from the text.

// now write out the variables
Console.WriteLine("username: " + username);
Console.WriteLine("amount: " + amount);
Console.WriteLine("message: " + message);

Ответы [ 2 ]

4 голосов
/ 01 мая 2011

Вы можете использовать группы захвата:

var regex = new Regex(@"^Cashpay\s+@([A-Za-z0-9_-]+)\s+(\d+)\s+(.+)$");
var text = "Cashpay @username 55 This is a sample message";

var match = regex.Match(text);

if (!match.Success)
    //Bad string! Waaaah!

string username = match.Groups[1].Value;
int amount = int.Parse(match.Groups[2].Value);
string message = match.Groups[3].Value;
3 голосов
/ 01 мая 2011

Этот метод не выполняет проверку ввода; в некоторых случаях это может быть нормально (например, ввод поступает из источника, который уже был проверен). Если вы получаете это из пользовательского ввода, вам, вероятно, следует использовать более надежный метод. Если он исходит из доверенного источника, но имеет несколько форматов (например, «Cashpay» является одним из многих вариантов), вы можете использовать переключатель или оператор if для управления потоком после разделения:

// make sure you validate input (coming from trusted source?) 
// before you parse like this.

string list[] = text.Split(new char [] {' '});

if (list[0] == "Cashpay")
{
    var username = list[1].SubString(1);
    var amount = list[2];
    var message = string.Join(' ',list.Skip(3));
}

или

// make sure you validate input (coming from trusted source?) 
// before you parse like this.

string list[] = text.Split(new char [] {' '},4);

if (list[0] == "Cashpay")
{
    var username = list[1].SubString(1);
    var amount = list[2];
    var message = list[3];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...