Russian Qt Forum

Qt => Общие вопросы => Тема начата: juvf от Июнь 15, 2023, 07:32



Название: ReqExp
Отправлено: juvf от Июнь 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+ - это пробельные символы (табы и/или пробелы).
Онлайн генератор дает такую же герулярку (https://regex-generator.olafneumann.org/?sampleText=%23address%09%20%20%09%3D%20%20%09%20%200xa1&flags=i&selection=8%7CWhitespaces,13%7CWhitespaces) на табы+пробелы.


Для Qt может нужна особая регулярка?


Название: Re: ReqExp
Отправлено: kambala от Июнь 15, 2023, 09:24
"^#address\\s*=\\s*"

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

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


Название: Re: ReqExp
Отправлено: juvf от Июнь 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*]"));


убрал ? и [] - заработало. И ^ тоже лишним не будет. Спасибо.


Название: Re: ReqExp
Отправлено: kambala от Июнь 15, 2023, 10:39
[\s+] означает «можно пустой символ или плюсик» (квадратные скобки задают набор доступных символов)
? означает «предыдущий токен может быть 0 или 1 раз»

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