Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Карманы в QRegExp

Автор: cupersuper 5.5.2011, 20:04

Здравствуйте,

Есть строка "Привет\r\nМир", нужно приобразовать её в "Привет.\r\nМир"

Пробывал как-то так:

txtString.replace( QRegExp("[а-я](\r\n)[А-Я]").cap(1),".\r\n" );

, может кто подскажет

Автор: RazrFalcon 5.5.2011, 22:05

Могу предложить:
http://regexr.com?2tmqa

Автор: xls 6.5.2011, 11:22

Цитата(cupersuper @ 5.5.2011, 20:04) *
txtString.replace( QRegExp("[а-я](\r\n)[А-Я]").cap(1),".\r\n" );

Кириллица не поддерживается, попробуй в Unicode : \\x0410-\\x042F

Автор: fedin.dmitriy 8.5.2011, 4:50

Все прикольно, только вот где указывается строка для поиска? :rolleyes:

QRegExp rx("(\r\n)");
if(rx.indexIn(txtString)!=-1) txtString.replace(rx.cap(1),".\r\n");


или второй пример уже более красивый
txtString.replace(QRegExp("\r\n"),".\r\n");


Оба прекрасно сработали. И когда в регулярном выражении задаются шаблоны, типа [a-z] или [A-Z] то они прекрасно срабатывают и на кириллицу тоже.

Автор: cupersuper 8.5.2011, 21:56

Уточню, хотел покороче описать проблему, но походу не получилось,
к примеру, есть строка:


Ехали медведи на велосипеде.
А за ними кот задом наперёд
А за ним комарики на воздушном шарике
А за ними раки на хромой собаке.

***

Вот оно, глупое счастье, с белыми окнами в сад!
По пруду лебедем красным плавает тихо закат.



В некоторых местах в пропущены точки в конце предложения (после "наперёд" и "шарике"), нужно определить конец предложения без точки:
[а-я]\r\n[А-Я]
И заменить на:
[а-я].\r\n[А-Я]

Вопрос кодировки не волнует, регулярное выражение вставляю в QString::fromLocal8Bit(). Если просто менять \r\n на .\r\n , то как-бы регулярка не нужна, т.к. данную замену надо производить не вконце каждого предложения, а только где подходит условие: "после строчной буквы - заглавная, без точки между ними".

Автор: Litkevich Yuriy 8.5.2011, 22:18

конец предложения - $
Следовательно и шаблон должен быть таким:

[^\.]$


Пардон, продолжение не прочитал

Автор: cupersuper 8.5.2011, 22:23

Например:

QRegExp rx( QString::fromLocal8Bit("[А-Я](\r\n)[а-я]") );
if(rx.indexIn(txtString)!=-1) txtString.replace(rx.cap(1),".\r\n");


необходимой замены не производит.
Интересно, возможно ли использование карманов QRegExp.cap() в связке с QString.replace?


to Litkevich Yuriy

$, насколько я помню конец всей строки QString, а надо перевод строки и каретки, и опять же сохраняя условие

Автор: Litkevich Yuriy 9.5.2011, 6:53

Цитата(cupersuper @ 9.5.2011, 1:23) *
$, насколько я помню конец всей строки QString, а надо перевод строки и каретки, и опять же сохраняя условие
просто конец строки (в зависимости от платформы - \r\n или \r или \n). Для регулярного выражения вообще "Конец всей строки QString" - неизвестный термин.

Автор: cupersuper 9.5.2011, 11:01

Цитата(Litkevich Yuriy @ 9.5.2011, 6:53) *
Цитата(cupersuper @ 9.5.2011, 1:23) *
$, насколько я помню конец всей строки QString, а надо перевод строки и каретки, и опять же сохраняя условие
просто конец строки (в зависимости от платформы - \r\n или \r или \n). Для регулярного выражения вообще "Конец всей строки QString" - неизвестный термин.


Ок, спасибо, буду знать, только у меня проблема не с определением конца строки, а именно с использованием .cap в .replace
Нужно условие:
"после строчной буквы - заглавная, без точки между ними"
заменить на
"после строчной буквы - заглавная, с точкой между ними"

а согласно выражению:
[^\.]$

я получу, например в данной строке:

Ехали медведи на велосипеде.
А за ними кот задом наперёд.
А за ним комарики на воздушном шарике.
А за ними раки на хромой собаке.
.
***.
.
Вот оно, глупое счастье, с белыми окнами в сад!.
По пруду лебедем красным плавает тихо закат.


четыре лишних точки (пометил зелёным).

Вобщем без QRegExp::cap() или QRegExp::capturedTexts() необойтись, да и хочется научиться их использовать в связке с QString::replace()

Я себе это представляю так:

txtString.replace( QRegExp("[а-я]($)[А-Я]").cap(1), ".\r\n" );


но не работает(


Собственно первый пример лучше подходил для моей ситуации

txtString.replace( QRegExp("[а-я](\r\n)[А-Я]").cap(1),".\r\n" );

т.к. $, действует только в конце выражения

Автор: cupersuper 9.5.2011, 11:45

и он также не срабатывает

Автор: cupersuper 9.5.2011, 13:17

Кстати, сейчас проверил выражение:

txtString.replace(QRegExp("$"),"XXX");


Применительно к строке, указанной в моём примере и результатом стало:

Ехали медведи на велосипеде.
А за ними кот задом наперёд
А за ним комарики на воздушном шарике
А за ними раки на хромой собаке.

***

Вот оно, глупое счастье, с белыми окнами в сад!
По пруду лебедем красным плавает тихо закат.XXX


Litkevich Yuriy, можете у себя проверить, это я о знаке $ в регулярных выражениях, хотя опять меня интересует другой вопрос

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)