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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: ReqExp  (Прочитано 4106 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« : Июнь 15, 2023, 07:32 »

Ни как не могу составить регулярку

Исходная строка такая
#address = 1234

Т.е. пользователь обязан написать '#address',  затем '=', затем численное значение. Символ '=' можно отделить, а можно и не отделять.
Человеку удобно все варианты
#address=1234
#address= 1234
#address     = 1234
Это всё одно и тоже.
Отделять можно хоть чем, хоть пробелами, хоть табами, хоть в перемешку, хоть не отделять.
Машина - тварь, не понимает.

принимаю строку в QString и пытаюсь удалить "address=" и оставить только '1234'.

Код:
line_.remove(QRegExp("#asd[\\s+]?=[\\s+]?"));

Если между '#address' и '=' только пробелы или только табы - то работает. Если вперемешку - то не работает.
допустим adress/пробел/пробел/таб/пробел/=/таб/пробел/таб/1234 - такую строку регулярка не может. Хотя \s+ - это пробельные символы (табы и/или пробелы).
Онлайн генератор дает такую же герулярку на табы+пробелы.


Для Qt может нужна особая регулярка?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Июнь 15, 2023, 09:24 »

"^#address\\s*=\\s*"

звездочка означает «0 и больше раз», а плюсик — «минимум один раз»

крышка спереди говорит, что это начало строки (может тебе она не нужна)
Записан

Изучением 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
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #2 : Июнь 15, 2023, 09:47 »

"^#address\\s*=\\s*"

звездочка означает «0 и больше раз», а плюсик — «минимум один раз»

крышка спереди говорит, что это начало строки (может тебе она не нужна)
Спасибо.
Проврил. #address=1234 без пробелов.
работает и
line_.remove(QRegExp("#asd[\\s+]?=[\\s+]?"));
и
line_.remove(QRegExp("#asd[\\s*]?=[\\s*]?"));

может из-за ? работает '\s+'?

вот так не работает
line_.remove(QRegExp("#asd[\\s*]=[\\s*]"));


убрал ? и [] - заработало. И ^ тоже лишним не будет. Спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Июнь 15, 2023, 10:39 »

[\s+] означает «можно пустой символ или плюсик» (квадратные скобки задают набор доступных символов)
? означает «предыдущий токен может быть 0 или 1 раз»

думаю, теперь ты поймешь почему твои варианты не работали
Записан

Изучением 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]   Вверх
  Печать  
 
Перейти в:  


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