![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
AD |
![]()
Сообщение
#1
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Буду благодарен, если напишите правильный regexp для след. цели: надо найти в строке символы, не являющиеся цифрами и точкой/запятой.
|
|
|
Tonal |
![]()
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
[^\d.,]
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Tonal, выглядит почти так
;) |
|
|
AD |
![]()
Сообщение
#4
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Хотел немного уточнить - а как сделать так, чтобы пробелы он тоже пропускал, есть ли значок "или" в регэкспе (нужно для того, чтобы пропускать спец. фразы - например, "C_OFF, C_ON, W_OFF, W_ON")?
|
|
|
AD |
![]()
Сообщение
#5
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
//
Вот сделал вот такой regexp!
Теперь осталось только додумать, чтобы отдельные символы "_", которые встречаются не в этих словосочетаниях тоже удалялись. Помогите, пожалуйста, доработать эту штуку! |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#7
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
В регэкспе как раз те словосочетания, которые не удаляются! Точнее удаляются все те, что не попадают под описание регэкспа. Но отдельные символы "_" он оставляет, а мне надо, чтобы они удалялись!!!!
Сообщение отредактировал AD - 28.8.2008, 16:57 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
вот и впиши его туда
|
|
|
AD |
![]()
Сообщение
#9
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Так давай с начала,
надо найти в строке символы, не являющиеся: цифрами . (точкой) , (запятой) _ (подчеркиванием), кроме случаев: C_OFF, C_ON, W_OFF, W_ON так? |
|
|
AD |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
смысл помоему не поменялся.
Т.е. анализатор "_" не находит, а "C_OFF" находит |
|
|
AD |
![]()
Сообщение
#13
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Tonal |
![]()
Сообщение
#14
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Ужос! Ты бы прочитал что-нибудь по регэкспам, стало бы жить сильно проще. Краткое описание: Это описание может содержать неточности, для уточнения смотри ассистента! Конструкция [что-то здесь] - это всегда 1 символ. Она может включать явное перечисление символов, указание диапазона символов (например a-z означает любой символ начиная с a и оканчивая z), групповые символы (например \d - эквивалентно 0-9, а \s - любой из пробельных символов, \w - любой из символов слова). Кроме того, если сразу после открывающей скобки стоил символ ^, конструкция инвертируется, и означает 1 любой символ кроме указанных. Да, некоторые специальные символы внутри конструкции меняют своё значение. Например . обозначает именно точку а не все символы. \b символ забоя (вроде '\07')... Теперь сам можешь разобрать что ты написал. ![]() Про задачу. Давай ты вообще без регекспов, на человеческом языке напишешь чего тебе нужно? Например: У меня есть строка содержащая такое (примеры). Я хочу, сделать с ней что-то (например выбрать все числа, или числа и спец-значения, или убрать ненужные символы...) И вместе подумаем как это проще и понятнее реализовать. |
|
|
AD |
![]()
Сообщение
#15
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Ужос! Ты бы прочитал что-нибудь по регэкспам, стало бы жить сильно проще. Краткое описание: Это описание может содержать неточности, для уточнения смотри ассистента! Конструкция [что-то здесь] - это всегда 1 символ. Она может включать явное перечисление символов, указание диапазона символов (например a-z означает любой символ начиная с a и оканчивая z), групповые символы (например \d - эквивалентно 0-9, а \s - любой из пробельных символов, \w - любой из символов слова). Кроме того, если сразу после открывающей скобки стоил символ ^, конструкция инвертируется, и означает 1 любой символ кроме указанных. Да, некоторые специальные символы внутри конструкции меняют своё значение. Например . обозначает именно точку а не все символы. \b символ забоя (вроде '\07')... Теперь сам можешь разобрать что ты написал. ![]() Про задачу. Давай ты вообще без регекспов, на человеческом языке напишешь чего тебе нужно? Например: У меня есть строка содержащая такое (примеры). Я хочу, сделать с ней что-то (например выбрать все числа, или числа и спец-значения, или убрать ненужные символы...) И вместе подумаем как это проще и понятнее реализовать. Мне необходимо удалять из строки все символы, которые не относятся к:
Что значит символы забоя? Если честно, я просто не понимаю некоторых спец. терминов, можно пояснить, пожалуйста? Я по-диагонали читал ассистент. Там про \b написано: Цитата \b - A word boundary. For example the regexp \bOK\b means match immediately after a word boundary (e.g. start of string or whitespace) the letter 'O' then the letter 'K' immediately before another word boundary (e.g. end of string or whitespace). But note that the assertion does not actually match any whitespace so if we write (\bOK\b) and we have a match it will only contain 'OK' even if the string is "It's OK now". Потому, я и решил, что можно использовать эти конструкции. Спасибо за ответ, содержащий разумную критику! ![]() ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#16
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
символы забоя? онже backspase, переход на символ назад с затиранием символапро \b написано: это когда он не в квадратных скобках, см. тут (PDF)
|
|
|
Tonal |
![]()
Сообщение
#17
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
1) Про символ '\b' нужно читать не в ассистенте, а в учебнике по С/С++ там же где и про символ '\n'
2) Когда в С/С++ пишешь регулярку нужно помнить об отслешивении слешей. Т.е. если в документации написано, что конструкция \b это граница слова, а ты хочешь найти скажем слово word, то в коде это будет выглядеть так:
3) Если ты ещё не понял, конструкция (слеши не отслешены): [\bC_ON\b\bW_ON\b\bC_OFF\b\bW_OFF\b] эквивалентна [\bC_ONWF] и найдёт 1 из перечисленных символов, но не их последовательность. 4) Пусть у тебя есть строка: "123.3 - 123 C_ON, W_ON, 1235, -456, C_OFF + W_OFF / Word G_is , OFF bat . War 5 dog_cat 67 ONtologi" После удаления у тебя получится: "123.3123C_ON,W_ON,1235,456,C_OFFW_OFF,.567" Именно это тебе нужно? |
|
|
AD |
![]()
Сообщение
#18
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
1) Про символ '\b' нужно читать не в ассистенте, а в учебнике по С/С++ там же где и про символ '\n' 2) Когда в С/С++ пишешь регулярку нужно помнить об отслешивении слешей. Т.е. если в документации написано, что конструкция \b это граница слова, а ты хочешь найти скажем слово word, то в коде это будет выглядеть так:
3) Если ты ещё не понял, конструкция (слеши не отслешены): [\bC_ON\b\bW_ON\b\bC_OFF\b\bW_OFF\b] эквивалентна [\bC_ONWF] и найдёт 1 из перечисленных символов, но не их последовательность. 4) Пусть у тебя есть строка: "123.3 - 123 C_ON, W_ON, 1235, -456, C_OFF + W_OFF / Word G_is , OFF bat . War 5 dog_cat 67 ONtologi" После удаления у тебя получится: "123.3123C_ON,W_ON,1235,456,C_OFFW_OFF,.567" Именно это тебе нужно? Нет для приведенной строки получилось совсем не то, что мне надо! Согласен, что у меня корявая конструкция!!! Как сделать правильно? |
|
|
Tonal |
![]()
Сообщение
#19
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Напиши какие строки у тебя на входе, и что тебе нужно получить на выходе.
|
|
|
AD |
![]()
Сообщение
#20
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Напиши какие строки у тебя на входе, и что тебе нужно получить на выходе. Входная строчка: str = "7.3W_ON Unknown_event 4.1_ON 1C_OFF TTA_FAIL_TRUE RESET" Выходная: str = "7.3W_ON 4.1_ON 1C_OFF" Например, вот так! |
|
|
Tonal |
![]()
Сообщение
#21
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
1) Составляем выражение, которое найдёт последовательность символов которую нужно оставить:
[\d.]+[WC]?_O(N|FF)\b Кстати, минус у чисел может быть? И ещё куда-то нужно запятую присобачить - из примера не видно. 2) Создаём QRegExp с этим выражением. 3) Для исходной строки ищем все вхождения и собираем из них выходящую строку. Вот реализация на python-е:
Думаю перевести на С++ труда не составит? ![]() П.С. Приведённое выражение поймает и такую последовательность: 1.2.3.4.5._ON Непонятно нужно ли с этим бороться... Сообщение отредактировал Tonal - 30.8.2008, 0:12 |
|
|
AD |
![]()
Сообщение
#22
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
1) Составляем выражение, которое найдёт последовательность символов которую нужно оставить: [\d.]+[WC]?_O(N|FF)\b Кстати, минус у чисел может быть? И ещё куда-то нужно запятую присобачить - из примера не видно. 2) Создаём QRegExp с этим выражением. 3) Для исходной строки ищем все вхождения и собираем из них выходящую строку. Вот реализация на python-е:
Думаю перевести на С++ труда не составит? ![]() П.С. Приведённое выражение поймает и такую последовательность: 1.2.3.4.5._ON Непонятно нужно ли с этим бороться... Спасибо! ![]() Либо точка, либо запятая. Приведенное выражение вполне правильное! ![]() |
|
|
AD |
![]()
Сообщение
#23
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
небольшой вопрос. А как сделать с помощью регэкспа, чтобы он находил любую последовательность символов, не принадлежащую заданной?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#24
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
AD, всмысле инверсии чтоли?
если да, то так [^...] где многоточие - Р.В. которое надо исключить |
|
|
Tonal |
![]()
Сообщение
#25
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Что такое "последовательность символов, не принадлежащую заданной"?
|
|
|
AD |
![]()
Сообщение
#26
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Tonal |
![]()
Сообщение
#27
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Ты опять криво выразился. Прочитай что-нибудь про регэкспы.
![]() В регулярном выражении существует понятие класса символов. На принадлежность или непринадлежность какому-нибудь классу символ можно тестировать. А вот принадлежность символа какому-нибудь произвольному регэкспу не определена. Например символ W и принадлпжит или нет в зависимости от того, какие символы его окружают. Можно тестировать строку на совпадение с регуляркой, но опять же например сторока C_ON с ней не совпадёт. Тут всё опять зависит от того, что ты хочешь сделать. Если таки убрать из текста всё лишнее, как описывал, то алгоритм я тебе уже нарисовал. Правда т.к. в QRegExp нет findall, придётся выписать цикл явно (см. пример к "Capturing Text"). П.С. Есть ещё позитивный и негативный предпросмотр, но с ним лучше не связываться, пока не разобрался нормально. ![]() |
|
|
AD |
![]()
Сообщение
#28
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Практически сделал, осталось добиться последнего.
Чтобы в строке подобного рода выражения [\\d.]+[WC]?_O(N|FF)\\b можно было встретить большое количество раз. А то, он вырезает только первое подобное выражение из строки, а все сотальные, удовлетворяющие заданному регулярному выражению, затирает. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#29
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
, а все сотальные, удовлетворяющие заданному регулярному выражению, затирает ЗАТИРАЕТ? наверное правильнее сказать не возвращает. тебе надо указатель дальше двигать по тексту, типа этого rx.indexIn(text, pos) |
|
|
AD |
![]()
Сообщение
#30
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Извините, забыл сразу выложить код, как я реализовал. Вот сейчас выкладываю:
source
Регэксп rx - это регэксп, который определяет те последовательности символов, которые следует оставить. Ну а далее, путем сравнений - это реализовано! |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 8.6.2025, 6:07 |