Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: LinuxFanUNIX в Aug 27, 2010, 01:13



Титла: QRegExp (sed) помощ
Публикувано от: LinuxFanUNIX в Aug 27, 2010, 01:13
Добър вечер (то е нощ де, но както и да е).

Та на проблема:

Имам следния стринг:
ala-bala

обаче искам през QRegExp да го направя така:
<b> ala-bala </b>

Обаче проблемът е че нещо не мога да налучкам правилният отговор. Смятам че трябва да е нещо от този род:

Код
GeSHi (C++):
  1. QString resul1 =  result2.replace(QRegExp("\[b][0-9][A-Z][a-z]\[/b]"), "<b>\\1</b>");

Обаче както споменах - близко съм (или така предполагам), но нещо не ми се получава. Та ако можете - ударете едно рамо!  :)

Благодаря предварително!


Титла: Re: QRegExp (sed) помощ
Публикувано от: dvasilev в Aug 27, 2010, 09:22
Не съм много силен в регулярните изрази, но си мисля, че това ще ти свърши работа

Код
GeSHi (C++):
  1. QString resul1 =  result2.replace(QRegExp("\[b\]([^\[]*)\[/b\]"), "<b>\\1</b>");


Титла: Re: QRegExp (sed) помощ
Публикувано от: remotex в Aug 27, 2010, 09:27
Забравил си да го оградиш със скоби (това което ще заместваш) напр.:
Код
GeSHi (C++):
  1. QString result2 =  "xyzala-balaxyz";
  2. QString resul1 =  result2.replace(QRegExp("([abl-]+)"), "<b>\\1</b>");
  3. // result1 == "xyz<b>ala-bala</b>xyz"
  4.  


Титла: Re: QRegExp (sed) помощ
Публикувано от: LinuxFanUNIX в Aug 27, 2010, 09:44
Не съм много силен в регулярните изрази, но си мисля, че това ще ти свърши работа

Код
GeSHi (C++):
  1. QString resul1 =  result2.replace(QRegExp("\[b\]([^\[]*)\[/b\]"), "<b>\\1</b>");
В този случай не се получава - връща това
При текст: abc
след замяната става:
[<b>]a</b>c[/b]

Пак не се получава.  :(


Титла: Re: QRegExp (sed) помощ
Публикувано от: remotex в Aug 27, 2010, 10:03
Не съм много силен в регулярните изрази, но си мисля, че това ще ти свърши работа

Код
GeSHi (C++):
  1. QString resul1 =  result2.replace(QRegExp("\[b\]([^\[]*)\[/b\]"), "<b>\\1</b>");

Note: The C++ compiler transforms backslashes in strings. To include a \ in a regexp, enter it twice, i.e. \\. To match the backslash character itself, enter it four times, i.e. \\\\.

Понеже горното дава предупреждение:
Код
GeSHi (C++):
  1. main.cpp:20: warning: unknown escape sequence '\]'
  2. main.cpp:20: warning: unknown escape sequence '\]'
  3.  

По-интересното е защо въпреки това работи: дай по-конкретен пример...
Не си дал такъв пример, но ...
Ако искаш да заместиш (интервалите са за да избегна форматирането) напр. [ b ]ala-bala[ /b ] да стане <b>ala-bala</b> тогава задължително погледни секцията за намиране минимално съвпадение (за/ради вложените етикети) и особено забележката в края, че веднъж си имах проблеми (исках да го направя само с израза и не стана) затова само със (забележи че примера даже не е с вложени а просто с 2 групи по-наблизо):
void QRegExp::setMinimal ( bool minimal )

Enables or disables minimal matching. If minimal is false, matching is greedy (maximal) which is the default.

For example, suppose we have the input string "We must be <b>bold</b>, very <b>bold</b>!" and the pattern <b>.*</b>. With the default greedy (maximal) matching, the match is "We must be <b>bold</b>, very <b>bold</b>!". But with minimal (non-greedy) matching, the first match is: "We must be <b>bold</b>, very <b>bold</b>!" and the second match is "We must be <b>bold</b>, very <b>bold</b>!". In practice we might use the pattern <b>[^<]*</b> instead, although this will still fail for nested tags.


Титла: Re: QRegExp (sed) помощ
Публикувано от: dvasilev в Aug 27, 2010, 10:46
@remotex: Вярно, забравил съм, че трябва да escape-на наклонените черти и да станат двойни.


Титла: Re: QRegExp (sed) помощ
Публикувано от: LinuxFanUNIX в Aug 27, 2010, 18:08
Благодаря на всички ви! Стана! Ето по този начин:

Код
GeSHi (C++):
  1. QString resul1 = result2.replace(QRegExp("\\[b\\]([^\\[]*)\\[/b\\]"), "<b>\\1</b>");

Още веднъж ви благодаря! Живи и здрави да сте!  [_]3 [_]3 [_]3