Russian Qt Forum
Ноябрь 26, 2024, 01:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QRegExp, два подвыражения, предваряющихся известными строками  (Прочитано 13429 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #15 : Июль 17, 2013, 23:33 »

Цитировать
регулярности
интересное слово какое Улыбающийся
Цитировать
Что тут происходит пo моему разумению...
дзен можно познать тут: http://qt-project.org/doc/qt-4.8/qregexp.html#details
Цитировать
есть ли необходимость явно указывать, что до конца строки может быть еще что-то?
нет
Цитировать
Как складывать в QStringList несколько соответствий одному и тому же регекспу?
не совсем ясна суть вопроса. можно пример?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
tester64
Гость
« Ответ #16 : Июль 17, 2013, 23:42 »

Метода вида QStringList occurences(QString, QRegExp) нет.
Можно так:
Код
C++ (Qt)
QRegExp rx(...);
QStringList list;
for (int pos = 0; (pos = rx.indexIn(str, pos)) != -1; pos += rx.matchedLength()) list += rx.cap(1);
Записан
thechicho
Гость
« Ответ #17 : Июль 18, 2013, 07:20 »

регулярки мощный инструмент и писать одно и то же ими можно по-разному.
я пишу таким образом:
rx.setPattern("access_token=([^&]+).*&expires_in=([^&]+).*$");
[^&]+ - все что угодно, кроме &
.* - все что угодно или ничего

^ - начало строки
[^abc] - все что угодно кроме a или b или c
[abc] - a или b или c

если написать
&expires_in=([^&]+)"); - захватит только 1 символ
&expires_in=([^&]+).*$"); - захватит все, что нужно

было бы шикарно, если после записи
[^&]+
не надо было ничего писать. регулярка бы сама парсила все до знака &.
но стоит rx.setMinimal(true);
и QRegExp почему-то парсит только первый символ
если добавить что-нибудь
[^&]+blabla
тогда парсит все до первого знака &

может я что-то не понимаю, но выглядит как баг. буду признателен, если кто-то пояснит этот момент.
Записан
Bepec
Гость
« Ответ #18 : Июль 18, 2013, 08:21 »

QRegExp != RegExp.

Я им давно не пользуюсь именно из-за его обрезанности (QRegExp). Есть многие другие библиотечки для RegExp с полной поддержкой стандарта, типа deelx.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #19 : Июль 18, 2013, 11:35 »

2thechicho: не знаю где ты такое вычитал, но никаких .*$ не нужно лепить в конец строки. простой тестовый пример:
Код
C++ (Qt)
   QRegExp rx("test=([^&]+)&qwerty");
   QString s("asdtest=234dfgjknwedfrgfg ee434---555!@#&qwerty");
   if (rx.indexIn(s) != -1)
       qDebug() << rx.cap(1); // 234dfgjknwedfrgfg ee434---555!@#

2Bepec: для большинства задач QRegExp вполне подходит. какие ты фичи регулярок используешь, которых нету в QRegExp?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #20 : Июль 18, 2013, 13:18 »

напиши вот так и поймешь, что я имел в виду
QRegExp rx("test=([^&]+)");

//Я им давно не пользуюсь именно из-за его обрезанности (QRegExp)
что там обрезано то? меня полностью устраивает. можно сделать все, что нужно.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #21 : Июль 18, 2013, 15:12 »

напиши вот так и поймешь, что я имел в виду
QRegExp rx("test=([^&]+)");
написал. не понял.
Код:
Starting D:\Programming\Qt\hello-4_8_5_msvs2012_x86-Debug\debug\hello.exe...
"234dfgjknwedfrgfg ee434---555!@#"

Starting D:\Programming\Qt\hello-Desktop_Qt_5_1_0_MSVC2012_64bit-Debug\debug\hello.exe...
"234dfgjknwedfrgfg ee434---555!@#"
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #22 : Июль 18, 2013, 15:49 »

Допустим нет просмотра выражения вперед. Жадность выражения указывается не в регэкспе, а отдельным флагом класса. Т.е. нельзя создать полноценный регэкс из строки. Это и убило мои последние приятные впечатления от него Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #23 : Июль 18, 2013, 18:04 »

Допустим нет просмотра выражения вперед
вперед ?= есть, нету ?<= назад.
Цитировать
Both zero-width positive and zero-width negative lookahead assertions (?=pattern) and (?!pattern) are supported with the same syntax as Perl. Perl's lookbehind assertions, "independent" subexpressions and conditional expressions are not supported.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #24 : Июль 18, 2013, 20:23 »

Цитировать
Starting D:\Programming\Qt\hello-4_8_5_msvs2012_x86-Debug\debug\hello.exe...
"234dfgjknwedfrgfg ee434---555!@#"

Starting D:\Programming\Qt\hello-Desktop_Qt_5_1_0_MSVC2012_64bit-Debug\debug\hello.exe...
"234dfgjknwedfrgfg ee434---555!@#"

rx.setMinimal(true); стоит?

(?=E)   Positive lookahead. This assertion is true if the expression matches at this point in the regexp. For example, const(?=\s+char) matches 'const' whenever it is followed by 'char', as in 'static const char *'. (Compare with const\s+char, which matches 'static const char *'.)
(?!E)   Negative lookahead. This assertion is true if the expression does not match at this point in the regexp. For example, const(?!\s+char) matches 'const' except when it is followed by 'char'.

"<div>(?:.(?!<div))+</div>"
пожалуйста, все есть.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #25 : Июль 18, 2013, 20:57 »

Цитировать
Starting D:\Programming\Qt\hello-4_8_5_msvs2012_x86-Debug\debug\hello.exe...
"234dfgjknwedfrgfg ee434---555!@#"

Starting D:\Programming\Qt\hello-Desktop_Qt_5_1_0_MSVC2012_64bit-Debug\debug\hello.exe...
"234dfgjknwedfrgfg ee434---555!@#"

rx.setMinimal(true); стоит?
нет, не стоит, я же привел код выше.

с ним да, захватывает лишь первый символ. я так понимаю в этом и состоит «нежадность»: раз дальше ничего не указано, то он и нежадно захватывает необходимый минимум, т.е. один символ (из-за +). с * так вообще ничего захватывать не будет. и это не баг.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #26 : Июль 18, 2013, 21:05 »

asdtest=234dfgjknwedfrgfg ee434---555!@#&qwerty&blabla

нежадность
asdtest=234dfgjknwedfrgfg ee434---555!@#
жадность
asdtest=234dfgjknwedfrgfg ee434---555!@#&qwerty

разве нет?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #27 : Июль 18, 2013, 21:54 »

жадность
asdtest=234dfgjknwedfrgfg ee434---555!@#&qwerty
такой вариант точно невозможен из-за [^&].

кажется я понял почему так. «нежадность» означает совпасть по самому минимуму, т.е. когда совпадает "2" (это ведь не амперсанд), минимум выполнен (дальше ведь никаких символов указано), и значит можно заканчивать.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #28 : Июль 18, 2013, 22:18 »

поэтому и нужно в конце .*$
а хотелось бы обойтись без этого. о чем я и писал выше.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #29 : Июль 18, 2013, 23:34 »

ну так не пиши [^&] да и все Улыбающийся конструкция [^&]+?.*$ выглядит очень калично как по мне, скорее всего еще и оказывает ненужную нагрузку при поиске.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.209 секунд. Запросов: 22.