Как разбить эту строку в дротике - PullRequest
0 голосов
/ 22 марта 2020

У меня есть строка "Salle: C101 Prof: ALa Spe: Gestion de projet: служебные и прочие работы \ Alt \ LP_CDTL"

, и я хотел бы разделить, чтобы иметь

["Salle", "C101"]
["Prof", "Ala"]
["Spe", "Gestion de projet : outils et mise en oeuvre"]

и преобразовать его в json

[
  {
    "Salle": "C101",
    "Prof": "Ala"
    "Spe": "Gestion de projet : outils et mise en oeuvre"
  }
]

Я знаю, как преобразовать его в json, мне просто нужна помощь, чтобы правильно разбить строку.

Редактировать

Вот моя первая попытка, но я надеюсь, что есть лучшее решение.

String desc = "Salle:C101 Prof:ALa Spe:Gestion de projet : outils et mise en oeuvre\\Alt\\LP_CDTL";

String salle = desc.substring(0, desc.indexOf('Prof') - 1);
String prof = desc.substring(
            desc.indexOf(salle) + salle.length + 1,
            desc.indexOf('Spe') - 1);
String spe = desc.substring(
            desc.indexOf(prof) + prof.length + 1,
            desc.indexOf('\\'));

List<String> salleList = salle.split(':');
String salleKey = salleList[0];
String salleValue = salleList[1];

List<String> profList = prof.split(':');
String profKey = profList[0];
String profValue = profList[1];

List<String> speList = spe.split(':');
String speKey = speList[0];
String speValue = speList.sublist(1).join(':');

print('[$salleKey:$salleValue]'); // Result : [Salle:C101]
print('[$profKey:$profValue]'); // Result : [Prof:ALa]
print('[$speKey:$speValue]'); // Result : [Spe:Gestion de projet : outils et mise en oeuvre]

1 Ответ

0 голосов
/ 22 марта 2020

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

import 'dart:convert';

void main() {
  print(parse(r'Salle:C101 Prof:ALa Spe:Gestion de projet : outils et mise en oeuvre\Alt\LP_CDTL'));
  print(parse(r'Salle: Prof: Spe:Divers Semestre 2\S2_INFO1\INFO1_S2'));
  print(parse(r'Salle:AMPHI F Prof:ECa Spe:Bases de la Conception Orientée Objet M2104\S2_INFO1\INFO1_S2'));
  print(parse(r'Salle:AMPHI F Prof:JMa Spe:Prog. & administration des Bases de Données M2106\S2_INFO1\INFO1_S2'));
}

String parse(String desc) {
  print('Parsing: $desc');
  final pattern = RegExp(r'Salle:(?<Salle>.*) Prof:(?<Prof>.*) Spe:(?<Spe>[\p{L}\d :.,&]*)\\.*', unicode: true);

  final match = pattern.firstMatch(desc);
  final map = {
    'Salle': match.namedGroup('Salle'),
    'Prof': match.namedGroup('Prof'),
    'Spe': match.namedGroup('Spe')
  };
  final list = [map];

  return const JsonEncoder.withIndent('  ').convert(list);
}

Вывод:

C:\tools\dart-sdk\bin\dart.exe --enable-asserts --enable-vm-service:63877 C:\Users\jacob\Documents\GitHub\AdventOfCode2019\bin\status.dart
Observatory listening on http://127.0.0.1:63877/2WFuV1uD4Lg=/

Parsing: Salle:C101 Prof:ALa Spe:Gestion de projet : outils et mise en oeuvre\Alt\LP_CDTL
[
  {
    "Salle": "C101",
    "Prof": "ALa",
    "Spe": "Gestion de projet : outils et mise en oeuvre"
  }
]
Parsing: Salle: Prof: Spe:Divers Semestre 2\S2_INFO1\INFO1_S2
[
  {
    "Salle": "",
    "Prof": "",
    "Spe": "Divers Semestre 2"
  }
]
Parsing: Salle:AMPHI F Prof:ECa Spe:Bases de la Conception Orientée Objet M2104\S2_INFO1\INFO1_S2
[
  {
    "Salle": "AMPHI F",
    "Prof": "ECa",
    "Spe": "Bases de la Conception Orientée Objet M2104"
  }
]
Parsing: Salle:AMPHI F Prof:JMa Spe:Prog. & administration des Bases de Données M2106\S2_INFO1\INFO1_S2
[
  {
    "Salle": "AMPHI F",
    "Prof": "JMa",
    "Spe": "Prog. & administration des Bases de Données M2106"
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...