Сопоставить свойства с помощью регулярных выражений - PullRequest
0 голосов
/ 01 марта 2019

У меня есть такая строка, представляющая набор свойств, например:

AB = 0, TX = "123", TEST = LDAP, USR = "", PROPS = "DN= VB, XN = P "

Мне нужно извлечь эти свойства в:

  1. AB = 0
  2. TX = 123
  3. TEST = LDAP
  4. USR =
  5. PROPS = DN = VB, XN = P

Чтобы решить эту проблему, я попытался использовать регулярное выражение, но безуспешно.

public IEnumerable<string> SplitStr(string input)
{
            Regex reg= new Regex("((?<=\")[^\"]*(?=\"(,|$)+)|(?<=,|^)[^,\"]*(?=,|$))", RegexOptions.Compiled);

            foreach (Match match in reg.Matches(input))
            {
                yield return match.Value.Trim(',');
            }
        }

Я не могу найти идеальное регулярное выражение для ожидаемого результата.С приведенным выше регулярным выражением вывод будет:

  1. AB = 0
  2. 123
  3. TEST = LDAP
  4. DN = VB, XN = P

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Другим способом может быть использование 2 групп захвата, где первая группа захватывает первую часть, включая знак равенства, а вторая группа - значение после знака равенства.

Затем вы можете объединить группы и использовать Trim для удаления двойных кавычек.Если после этого вы также захотите удалить пробелы, вы можете снова использовать Trim.

([^=\s,]+=)("[^"]+"|[^,\s]+)

Это будет соответствовать

  • ( Первая группа захвата
    • [^=\s,]+= Совпадение 1+ раз, а не знак равенства, запятая или символ пробела, затем совпадение = (Если имя свойства может содержать запятую, вы можете вместо этого использовать класс символов и указать, что вы хотите сопоставлять, например [\w,]+)
  • ) Закрыть группу
  • ( Вторая группа захвата
    • "[^"]+" Совпадение от открытия до закрытия двойная кавычка
    • | Или
    • [^,\s]+ Совпадение 1+ раз, не запятая или символ пробела
  • )

Regex demo | C # demo

Ваш код может выглядеть следующим образом:

public IEnumerable<string> SplitStr(string input)
{
    foreach (Match m in Regex.Matches(input, @"([^=\s,]+=)(""[^""]+""|[^,\s]+)"))
    {
        yield return string.Concat(m.Groups[1].Value, m.Groups[2].Value.Trim('"'));
    }
}
0 голосов
/ 01 марта 2019

Вы можете использовать

public static IEnumerable<string> SplitStr(string input)
{
    var matches = Regex.Matches(input, @"(\w+=)(?:""([^""]*)""|(\S+)\b)");
    foreach (Match match in matches)
    {
       yield return string.Concat(match.Groups.Cast<Group>().Skip(1).Select(x => x.Value)).Trim();
    }
}

Данные регулярного выражения:

  • (\w+=) - Группа 1: один или несколько символов слова и = символ
  • (?:""([^""]*)""|(\S+)\b) - группа без захвата, соответствующая любой из двух альтернатив:
    • "([^"]*)" - ", затем 0 или более символов, отличных от ", а затем "
    • | - или
    • (\S+)\b - любые 1+ символов, кроме пробелов, как можно больше, вплоть до положения границы слова.

См. Демонстрационный пример regex .

Код string.Concat(match.Groups.Cast<Group>().Skip(1).Select(x => x.Value)).Trim() исключает значение группы 0 (полное совпадение) из групп, принимает группы 1, 2 и 3 и объединяет ихв одну строку и затем обрезает ее.

C # test :

var s = "AB=0, TX=\"123\", TEST=LDAP, USR=\" \", PROPS=\"DN=VB, XN=P\"";
Console.WriteLine(string.Join("\n", SplitStr(s)));

Вывод:

AB=0
TX=123
TEST=LDAP
USR=
PROPS=DN=VB, XN=P
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...