функция поиск-замена, точное совпадение

Тема в разделе "Решение различных задач по парсингу", создана пользователем EvgenStor, 22 май 2014.

  1. EvgenStor

    EvgenStor New Member Пользователи

    Регистрация:
    1 окт 2013
    Сообщения:
    16
    Приветствую всех,

    подскажите пожалуйста, есть ли решение для следующей проблемы:

    Допустим я хочу поменять слово Red|красный
    но в месте с этим меняются части слова содержащие "Red"
    т.е. "Redbool" заменится на "красныйbool"
    или слово "credo" заменится на "cкрасныйo"
    Еще пример:
    стройка|Строительная площадка
    "Перестройка помещения" станет "ПереСтроительная площадка помещения"
    Как этого избежать?
    Возможно есть способ точного вхождения в слово?
     
  2. alamina.moon

    alamina.moon Модератор Команда форума Модератор

    Регистрация:
    14 янв 2013
    Сообщения:
    214
    ну как вариант поставить пробелы перед словом RED в начале и в конце :)
    пробелREDпробел|пробелКрасныйпробел
    понятно что не слово пробел должно быть написано а стоять реальный пробел :)
    re:\sRED\s| Красный
     
  3. EvgenStor

    EvgenStor New Member Пользователи

    Регистрация:
    1 окт 2013
    Сообщения:
    16
    Именно так я сейчас и делаю, но это как минимум не удобно, но проблема в том, что ни везде в коде есть пробелы, а если пробела не будет то и функция не сработает.

    таким выражением я не пробовал, но я так понимаю что оно действует тоже только при наличии пробела в заменяемом слове?
     
  4. alamina.moon

    alamina.moon Модератор Команда форума Модератор

    Регистрация:
    14 янв 2013
    Сообщения:
    214
    Можете привести пример в каком выражении требуется заменить RED?
     
  5. alamina.moon

    alamina.moon Модератор Команда форума Модератор

    Регистрация:
    14 янв 2013
    Сообщения:
    214
    Redbool
    пробела нет, функция не сработает, разве вы не этого хотели?
     
  6. Root

    Root Администратор Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    14.818
    Город:
    Барнаул
    Вот пример:
    RedBool, red,...
    У red нет пробела в конце, там может быть скобка или символ пунктуации. Я, к сожалению, сейчас не силен в регулярках, подскажите, кто знает, пожалуйста...
     
  7. EvgenStor

    EvgenStor New Member Пользователи

    Регистрация:
    1 окт 2013
    Сообщения:
    16
    Я же говорю что не всегда с пробелом может пройти, самый простетский пример который мне первым пришел в голову

    "Apple iPhone 5 Red" комбинация пробелREDпробел НЕ поможет
    а комбинация "пробелRED" заменит так же слово RedBool
    как видите не помогает!

    И поверьте мне таких примеров ни мало, а очень много!
    Blue
    Bluetooth
    и т.д.

    могу перечислять до бесконечности
     
  8. EvgenStor

    EvgenStor New Member Пользователи

    Регистрация:
    1 окт 2013
    Сообщения:
    16
    Может быть, а может и не быть.

    Когда выдергиваешь к примеру из <title>Apple iPhone 5 Red<title> только название "Apple iPhone 5 Red" пробелов по краям и всяких знаков не остается.
     
  9. alamina.moon

    alamina.moon Модератор Команда форума Модератор

    Регистрация:
    14 янв 2013
    Сообщения:
    214
    ну вот в этой конкретной строке
    re:\sRed$| Красный
     
  10. alamina.moon

    alamina.moon Модератор Команда форума Модератор

    Регистрация:
    14 янв 2013
    Сообщения:
    214
    Если не всегда с пробелом сработает опишите все возможные варианты чтоб сработало
     
  11. Root

    Root Администратор Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    14.818
    Город:
    Барнаул
    "Red"
     
  12. EvgenStor

    EvgenStor New Member Пользователи

    Регистрация:
    1 окт 2013
    Сообщения:
    16
    Как это использовать? Пробовал просто "Red"|красный и re:"Red"|красный
    ничего не меняет почемуто
     
  13. Freesty1er

    Freesty1er New Member Пользователи

    Регистрация:
    30 дек 2013
    Сообщения:
    95
    Вот так:
    Код:
    re:\bRed\b|Красный
    Не чуствительный к регистру: re:(?i)\bRed\b|красный
     
    Последнее редактирование: 22 май 2014
  14. Root

    Root Администратор Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    14.818
    Город:
    Барнаул
    Елки, у меня не работает это...
     
  15. Freesty1er

    Freesty1er New Member Пользователи

    Регистрация:
    30 дек 2013
    Сообщения:
    95
    А в каком именно случае не работает?

    Я здесь тестил: Ссылки недоступны для гостей + Ссылки недоступны для гостей
    Подождем ответа от EvgenStor.
     
    Последнее редактирование: 22 май 2014
  16. EvgenStor

    EvgenStor New Member Пользователи

    Регистрация:
    1 окт 2013
    Сообщения:
    16
    Все работает замечательно, оказалось все так просто!
    Огромное спасибо Freesty1er

    А как нибудь можно в это выражение добавить правило, что бы символы - \ тоже учитывались? Например:

    Red-Black будет переводится отдельным выражением "красно-черный"
    и в этом случае "красный-черный" маленько выглядит нелепо.
    Но это уже как говорится для меня не столь важно, но было бы не плохо. :)
     
  17. Freesty1er

    Freesty1er New Member Пользователи

    Регистрация:
    30 дек 2013
    Сообщения:
    95
    Если честно, не охота голову ломать. Можно по-разному придумать, зависит чего именно хотите добиться. В целом, это:
    Код:
    re:(?i)\bred(\ ?-{sep}\ ?/)|красно$1
    Если нужны большие буквы:
    Код:
    re:\bRed(\ ?-{sep}\ ?/)|Красно$1
    re:(?i)\bred(\ ?-{sep}\ ?/)|красно$1
    re:\b(Red{sep}RED)\b|Красный
    re:(?i)\bRed\b|красный
    re:\b(Black{sep}BLACK)\b|Черный
    re:(?i)\bBlack\b|черный
    Ссылки недоступны для гостей
    Т.е. просто делаете большой список замен, под нужные цвета.

    Могу поспорить, что можно намного интереснее сделать и проще. Но эту работу оставлю вам :highfive:
     
  18. Root

    Root Администратор Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    14.818
    Город:
    Барнаул
    Я понял почему у меня не работало, русские буквы уже не заменяет, вот досада) вот так компонент регулярок =)
     
  19. Freesty1er

    Freesty1er New Member Пользователи

    Регистрация:
    30 дек 2013
    Сообщения:
    95
    Ага, интересно. Не знал :) Вместо \b используют: [^a-zA-Zа-яА-ЯёЁ]. Вот только в этот диапазон не входит начало строки ^ почему-то.
     
    Последнее редактирование: 23 май 2014
  20. Kreol

    Kreol Модератор Команда форума Модератор

    Регистрация:
    6 янв 2013
    Сообщения:
    2.666
    Либо я не уловил ход мысли, либо вы неправильно описывате то что нужно.
    [^a-zA-Zа-яА-ЯёЁ] регуярка сделает выборку ВСЕГО что не попадает под перечисление групп символов которые внутри квадратных скобок.
    Начало строки вообще тут никаким боком.
    \b - Начало или конец слова, т. е. граница между символами, один из которых удовлетворяет \W, а другой - удовлетворяет \w
    И как всегда, вообще все слишком извращенно)
     

Поделиться этой страницей