Помогите мне разбить строку, используя RegExp - PullRequest
3 голосов
/ 20 января 2010

пожалуйста, помогите мне эту проблему. Я хочу разделить "-action = 1" на "action" и "1".

string pattern = @"^-(\S+)=(\S+)$";
Regex regex = new Regex(pattern);
string myText = "-action=1";
string[] result = regex.Split(myText);

Я не знаю, почему результат имеет длину = 4.

result[0] = ""
result[1] = "action"
result[2] = "1"
result[3] = ""

Пожалуйста, помогите мне.

P / S: я использую .NET 2.0.

Спасибо.

Здравствуйте, я тестировал со строкой: @ "- destination = C: \ Program Files \ Release", но результат был неточным, я не понимаю, почему длина результата = 1. Я думаю, потому что в строке есть пробел .

Я хочу разделить его на «пункт назначения» и «C: \ Program Files \ Release»

Дополнительная информация: это мое требование: -string1 = string2 -> разделить его на: string1 & string2. В string1 и string2 не содержатся символы: '-', '=', но они могут содержать пробелы.

Пожалуйста, помогите мне. Спасибо.

Ответы [ 5 ]

5 голосов
/ 20 января 2010

Не используйте разделение, просто используйте Match, а затем получите результаты из коллекции Groups по индексу (индекс 1 и 2).

Match match = regex.Match(myText);
if (!match.Success) {
    // the regex didn't match - you can do error handling here
}
string action = match.Groups[1].Value;
string number = match.Groups[2].Value;
3 голосов
/ 20 января 2010

В .NET Regex вы можете называть свои группы.

string pattern = @"^-(?<MyKey>\S+)=(?<MyValue>\S+)$";
Regex regex = new Regex(pattern);
string myText = "-action=1";

Затем выполните «Match» и получите значения по именам вашей группы.

Match theMatch = regex.Match(myText);
if (theMatch.Success)
{
    Console.Write(theMatch.Groups["MyKey"].Value); // This is "action"
    Console.Write(theMatch.Groups["MyValue"].Value); // This is "1"
}
3 голосов
/ 20 января 2010

Попробуйте (обновлено, чтобы добавить Regex.Split):

string victim = "-action=1";
string[] stringSplit = victim.Split("-=".ToCharArray());
string[] regexSplit = Regex.Split(victim, "[-=]");

РЕДАКТИРОВАТЬ: Используя ваш пример:

string input = @"-destination=C:\Program Files\Release -action=value";
foreach(Match match in Regex.Matches(input, @"-(?<name>\w+)=(?<value>[^=-]*)"))
{
    Console.WriteLine("{0}", match.Value);
    Console.WriteLine("\tname  = {0}", match.Groups["name" ].Value);
    Console.WriteLine("\tvalue = {0}", match.Groups["value"].Value);
}
Console.ReadLine();

Конечно, этот код имеет проблемы, если ваш путь содержит - символ

0 голосов
/ 20 января 2010

В своем выступлении Мастер регулярных выражений , Марк Доминус атрибуты следующее полезное правило для Обучения Perl автора (и такого же пользователя StackOverflow Рэндал Шварц:

  • Используйте захват или m//g [или regex.Match(...)], когда вы знаете, что хотите сохранить.
  • Используйте split, когда знаете, что хотите выбросить.
0 голосов
/ 20 января 2010

Что не так с использованием string.split ()?

string test = "-action=1";
string[] splitUp = test.Split("-=".ToCharArray());

Я признаю, что это все равно дает вам, возможно, больше параметров, чем вы хотели бы видеть в разделенном массиве ...

[0] = ""
[1] = "action"
[2] = "1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...