LINUX.ORG.RU

Особенности маскирования прямых слешей в QRegExp

 ,


0

1

У меня есть строка вида:

QString href="mytetra://note/14433417722c6dzjr63c";

В строке меняется только последняя часть - это уникальный идентификатор.

И не работает следующая функция:
bool ReferenceFormatter::isHrefInternal(QString href)
{
  if(href.contains(QRegExp("^mytetra://note/\\w$")))
    return true;
  else
    return false;
}

То есть, с тестовой строкой возвращает false, хотя должна возвращать true.

Я пробовал варианты:

if(href.contains(QRegExp("^mytetra:\/\/note\/\\w$")))

if(href.contains(QRegExp("^mytetra:\\/\\/note\\/\\w$")))

if(href.contains(QRegExp("^mytetra\:\/\/note\/\\w$")))

if(href.contains(QRegExp("^mytetra\\:\\/\\/note\\/\\w$")))


Но ни один на тестовой строке не срабатывает правильно.

Каким должно быть регулярное выражение, проверяющее данную строку?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 3)
^mytetra

у тебя в начале строки стоит не «mytetra», а «href=» и т.д.

Вот примерно то, что тебе нужно. Экранируй все обратные слеши когда будешь копипастить в код.

^href="mytetra:\/\/note\/\w+";$

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

Может, я непонятно написал. Я имел в виду вот это:

QString href="mytetra://note/14433417722c6dzjr63c";

qDebug() << "Is internal: " << isHrefInternal(href);

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

Ну тогда вот

^mytetra:\/\/note\/\w+$

а с экранированными слешами вроде должно быть так.

^mytetra:\\/\\/note\\/\\w+$
WRG ★★★★
()
Ответ на: комментарий от Xintrea

вот так вроде работает.

#include <QCoreApplication>
#include <QRegExp>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QRegExp rx("^mytetra:\\/\\/note\\/\\w+$");
    if(QString("mytetra://note/14433417722c6dzjr63c").contains(rx)) {
        qDebug() << "OK";
    }

    return a.exec();
}

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

\w соответствует одной букве, цифре или нижнему подчеркиванию. У тебя одна и более букв и цифр.

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

Тогда пиши {1} вместо плюса.

Тогда я вообще не понимаю регулярных выражений. Ведь «\w» должно искать именно вхождение слова. Зачем ему еще «{1}» вписывать???

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

У меня должно быть четко одно слово. Поэтому я пишу без плюса.

\w - это один символ, а не слово. Поэтому \w+

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

\w соответствует одной букве, цифре или нижнему подчеркиванию. У тебя одна и более букв и цифр.

Здрасьте, приехали. \w по сути должна быть аналогом [A-Za-z0-9_]

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

незачем, тебе нужно \w+. Иначе под твой регэксп подойдёт только «mytetra://note/1», а «mytetra://note/14» уже нет.

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

Ну так и есть.

Блин, это я ступил. В моих записульках \w - это слово, а это на самом деле символ.

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

Нет, это вхождение символа, который составляет слова - латинские буквы и цифры и вроде подчеркивание.

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

Штоа?

Ну вот так. Я перевожу большие тексты:

http://webhamster.ru/site/page/index/articles/comp/276

Но только со словарем. Если бы у меня было много времени, я бы лучше перевел всю документацию на Qt, а потом бы ей пользовался. Но это непосильная задача даже для группы переводчиков. На http://doc.crossplatform.ru пытались, но давно уже забили.

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

Ну давай еще подкину (один символ):

\w
\w{1}
\w{1,1}
один и более символов:
\w+
\w{1,}
4 и более символов:
\w{4,}
4 и более символов, и этого слова может не быть:
(\w{4,})?
4 и более, и этого слова может не быть, и нам не нужны результаты матча (к чому забивать память не нужным хламом?):
(?:\w{4,})?
два одинаковых слова по 4 и более символов, где любого из слов может не быть:
(\w{4,})?(\\1)?

А вообще вот, советую: http://www.regular-expressions.info/

deep-purple ★★★★★
()
Ответ на: комментарий от Xintrea

А почему «+»?

Потому что документацию надо читать. Там все написано. А еще в демках я видел тестер регулярок, советую его попробовать, ибо отладка регулярок в коде - верх извращенного мазохизма.

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

Чем оно лучше examples/tools/regexp из комплекта qt?

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

А всё, увидел. Не думал, что там скриншоты есть

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

А мну на коленке себе тестер состряпал. Тяп ляп со страшным, перегруженным междумордием. Но удобно и справка под рукой, и сразу сношает сроку регуляркой, и регулярку строкой всеми возможными способами.

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

И на string list разбивает с отображением координат элементов? Ещё одна тестилка QRegExp'ов не будет лишней на гитхабе :)

Suigintou ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.