Извлечение путей к файлам и аргументов с пробелом из XML в виде разных строк - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть XML-файл, который содержит некоторую информацию для запуска приложения из моего exe-файла.Например:

<details>
    C:\Program Files\...\abc.exe -env env -direnv direnv
</details>

Мне нужно разделить в качестве первой части пути для exe и оставшихся в качестве аргументов.Но я получаю только C:\Program, когда делю пробел.Есть ли другое решение для получения вывода в виде:

string [0] = C: \ Program Files ... \ abc.exe
string [1] = -env env -direnv
direnv

Редактировать код для извлечения из XML:

XMLNodeLst = GetNodeFromXML().SelectNodes("Path");

if (XMLNodeLst != null)
{
    foreach (XmlNode xmlNode in XMLNodeLst)
    {
        foreach (XmlNode pathNode in xmlNode.ChildNodes)
        {
            Match m = Regex.Match(source, pathNode.Name, RegexOptions.IgnoreCase);
            if (m.Success)
            {
                installPath = pathNode.InnerText.Trim();
                break;
            }
            else
            {
                logs.Error("No corresponding value in settings for the provided source name. Please check again!");
                MessageBox.Show("No corresponding value in settings for the provided source name. Please check again!");
                Environment.Exit(-1);
            }
        }
    }
}

XML:

<?xml version="1.0" encoding="utf-8" ?>
<Path>
  <details>
    C:\Program Files\...\abc.exe -env env -direnv direnv
  </details>
</Path>

Для разделения:

string[] configs = installPath.Trim().Split(' ');
exePath = configs[0];
exeArgs = installPath.Remove(0, installPath.IndexOf(' ') + 1);

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Вы можете разделить на положительный взгляд сзади и положительный взгляд вперед, чтобы утверждать, что слева есть .exe, за которым следует пробел, а справа - тире, за которым следует 1+ непробельных символов:

(?<=\.exe) (?=-\S+)

Regex demo

var installPath = @"C:\Program Files\...\abc.exe -env env -direnv direnv";
string[] configs = Regex.Split(installPath, @"(?<=\.exe) (?=-\S+)");
var exePath = configs[0];
Console.WriteLine(exePath); // C:\Program Files\...\abc.exe

См. Демонстрацию C #

0 голосов
/ 12 декабря 2018
var splitted = pathNode.InnerText.Trim()
    .Split(new string[] { ".exe " }, StringSplitOptions.None);

var path = splitted[0] + ".exe";
var args = splitted[1];
0 голосов
/ 12 декабря 2018

Пример класса, который можно использовать для разбора строки:

public class ArgumentPathResult {
    public string Path;
    public List<string> Arguments = new List<string>();
}
// Define other methods and classes here
public static class ArgumentPathParser {
    public static ArgumentPathResult ParsePath(string path) {
        ArgumentPathResult result = new ArgumentPathResult();
        string resultString = "";
        foreach(char c in path){
            resultString += c;
            if(resultString.Contains(".exe")){
                break;
            }
        }
        result.Path = resultString;
        result.Arguments = path.Replace(resultString, "")
            .Split('-')
            .Skip(1)
            .ToList();
        return result;
    }
}

Пример использования:

string path = @"C:\Program Files\...\abc.exe -env env -direnv direnv";
ArgumentPathResult result = ArgumentPathParser.ParsePath(path);

Объект результата будет содержать ваш путь как одну переменную, исписок пар аргументов и значений "env env" и "direnv direnv"

...