LINUX.ORG.RU

QRegularExpression сделать аналог split

 , ,


0

1

Добрый день.
Имеется код:

QString st = "1,2,3,4,5-6,7,8,9";
QRegularExpression regexp("(?:\\,|^)\\d+(?:\\,|$)");
QRegularExpressionMatchIterator i = regexp.globalMatch(st);
while (i.hasNext())
    qDebug() << i.next().capturedTexts();
Вывод:
("1,")
(",3,")
(",7,")
(",9")
Вопрос: как бы мне сделать так, чтобы получить в результатах также подстроки:
",2,"
",4,"
",8,"
?

★★★★★

Последнее исправление: rumgot (всего исправлений: 1)

Ответ на: комментарий от anonymous

Стоп. Я херню написал. Попробую еще раз.

QString st = "1,2,3,4,5-6,7,8,9";
QRegularExpression regexp("(?:\\,|^)(\\d+)(?:\\,|$)");
QRegularExpressionMatchIterator i = regexp.globalMatch(st);
while (i.hasNext())
    qDebug() << i.next().captured(2);//или 1 я всегда путаю

Вообще у тебя вроде излишне сложный regex

anonymous
()
Ответ на: комментарий от RazrFalcon

Так мне нужно, чтобы там где "-" не разбивались. Но это далее, там все работает. Сейчас нужно выделить именно одиночные цифры.

rumgot ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Не пойдет. Метод capturedTexts() и так выдает все, что захватилось. Тут проблема именно в том, что «1,» как будто вырезается из дальнейшего сопоставления и далее «2» не попадает в совпадение. Думал, может как-то параметрами можно как-то это поведение корректировать.

rumgot ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А, я думал тебя напрягает что лишние `,` видны. Ну блин.

Не, это нормально, там потом скобки поставить и выделять с помощью captured(). Беда именно в том, что не все цифры попадают.

rumgot ★★★★★
() автор топика
Последнее исправление: rumgot (всего исправлений: 1)

Или делать вначале обычный split по запятой (","), а потом смотреть в результатах на предмет тире ("-") ? Но это как-то убого. Неужели элементарный split средствами регулярных выражений не сделать?

rumgot ★★★★★
() автор топика
  QString st = "1,2,3,4,5-6,7,8,9";
  QRegularExpression regexp("((\\d|-)+)");
  QRegularExpressionMatchIterator i = regexp.globalMatch(st);
  while (i.hasNext())
    qDebug() << i.next().captured(1);
"1"
"2"
"3"
"4"
"5-6"
"7"
"8"
"9"

Так?

Еще можно так

QRegularExpression regexp("(\\d+)");

"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"

anonymous
()

А можно сделать так, чтобы на регулярное выражение:

"\\d+"
И строке для поиска:
st="123";
Выдавались результаты:

"1"
"2"
"3"
"12"
"23"
"123"
и т.д.

rumgot ★★★★★
() автор топика
Ответ на: комментарий от rumgot

Лучшее что я смог придумать

  QString st = "1,2,3,4,5-6,7,8,9";
  QRegularExpression regexp("((\\d+),|\\d+-\\d+)");
  QRegularExpressionMatchIterator i = regexp.globalMatch(st);
  while (i.hasNext())
  {
    const auto& result = i.next().captured(2);
    if (!result.isEmpty())
      qDebug() << result;
  }
"1"
"2"
"3"
"4"
"7"
"8"
anonymous
()
Ответ на: комментарий от rumgot

Я бы средствами си++ реализовал. Т.е. в строку бы складывал поочереди и печатал ее каждый раз.

anonymous
()
Ответ на: комментарий от rumgot

мне нужно, чтобы там где "-" не разбивались

Ну так сплитни просто по запятой.

Сейчас нужно выделить именно одиночные цифры

Ты уже определись что тебе надо. То Вася, то не Вася.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Читай мое первое сообщение. Как там написано, так и нужно.

rumgot ★★★★★
() автор топика
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от Deleted

Отлично! Работает. То что нужно. Спасибо. Совсем я забыл про эти просмотры назад/вперед без захвата.

rumgot ★★★★★
() автор топика
Последнее исправление: rumgot (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.