LINUX.ORG.RU

Сматчить статичную строку с символом/группой символов в любом её месте

 ,


0

2

Привет!

Ребята, я как-то совсем заблудился в документации к регэкспам. Есть ли возможность сматчить статичную строку, с учётом определённой группы символов, которая может появиться в любом месте этой строки?

Например, надо ловить фразу «Мама мыла раму» и в строке

«Мама мыла<br> раму»

и в строке

«Мама <br>мыла раму».

Такое вообще возможно реализовать регэкспами?

Спасибоньки!

Можно найти определенную группу символов по регулярке «<br>» и заменить ее на пустоту, в итоге получим искомую строку.

CrossFire ★★★★★ ()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от CrossFire

Нет, так не очень подойдет, потому что вокруг искомой строки есть ещё куча таких же групп и их нужно сохранить.

Чтобы лучше было понятно, задача в замене текста в docx с попыткой сохранения форматирования. Про Python-Docx в курсе, но он слишком многое ломает, пытаюсь вот навелосипедить своё решение.

mega_venik ★★★ ()
Ответ на: комментарий от mega_venik

Ах вон он чё. Тогда да, лучше сначала удалить всё лишнее. А регулярками я хз.

anonymous ()
Ответ на: комментарий от mega_venik

В совсем любом месте строки, даже посреди слова. Возможно, даже в нескольких местах.

Т.е. строка «Матумба, мешкая, пердылила Рамаяну» подойдёт?

proud_anon ★★★★★ ()

И «Мама мыла<br> раму» и «Мама<br> мыла раму» после сортировки дадут одинаковую строку " <>brМаааалмммруы", а «Мама мыла раму» будет " Маааалмммруы".

Стрипаем и получаем стандартный поиск подстроки в строке.

vvn_black ★★★★★ ()
Ответ на: комментарий от vvn_black

И «Мама мыла<br> раму» и «Мама<br> мыла раму» после сортировки дадут одинаковую строку

Ты точно PHPшник или фронтендер. Настолько черезжопно и нерабоче могут сделать только они.

anonymous ()
Ответ на: комментарий от anonymous

Есть текст с некими управляющими символами. Нужен поиск строки без учета этих символов.

Если управляющие символы заранее известны, то да, убираем и ищем. Если неизвестны, то по граничным словам строки поиска выделяем фрагменты в исходном тексте и матчим так, как я предложил. Почему нет?

Предложи свой вариант?

vvn_black ★★★★★ ()
Ответ на: комментарий от vvn_black

Нужен поиск строки без учета этих символов.

На строке «Мама мыла раму мылом» твой «алгоритм» сломается. Пойнт в том что сортировка абсолютно никчемный шаг.

Предложи свой вариант?

xml парсер, поиск нужных поледовательностей из text node. Причем это позволит сделать замену, про которую ты даже не думал.

anonymous ()
Ответ на: комментарий от proud_anon

Т.е. строка «Матумба, мешкая, пердылила Рамаяну» подойдёт?

Нет, куски, которые нужно игнорировать, являются XML-тегами

mega_venik ★★★ ()

Так это же простейшай регулярка. В чем прикол?

На js вот так будет

console.log(

 "blamla\nмама foo<br> мыла раму\nfoo\n blamla\nащщ мама мыла  <br>раму kfk аоаооа\nikfkf ffkfk flfk"
  .match(/^.*мама.+мыла.+раму.*$/mg)

)

[ 'мама foo<br> мыла раму',
  'ащщ мама мыла  <br>раму kfk аоаооа' ]
перепиши на пистон и попробуй

sadlinuxoid ()
Ответ на: комментарий от mega_venik

куски, которые нужно игнорировать, являются XML-тегами

Если только одиночные теги, то вот так

console.log(

 "<ba>мама<br>мыла раму\nblamla\nмама foo<br> мыла раму\nfoo\n blamla\nмама мыла <br>раму <b>\nащщ мама мыла  <br>раму kfk аоаооа\nikfkf ffkfk flfk"
   .match(/^\s*(<[^>]+>)*\s*мама\s*(<[^>]+>)*\s*мыла\s*(<[^>]+>)*\s*раму\s*(<[^>]+>)*\s*$/mg)

)

//[ '<ba>мама<br>мыла раму', 'мама мыла <br>раму <b>' ]

sadlinuxoid ()
Ответ на: комментарий от mega_venik

У тебя 3 варианта: стрипать теги перед поиском (самый разумный), делать свой алгоритм поиска, игнорирующий теги (может быть ок в зависимости от ситуации) и динамически делать регэксп, вставляющий возможность тега после каждого символа (самый бредовый). Регэкспами тут появляются только в третьем случае.

x3al ★★★★★ ()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от sadlinuxoid

это бред какой-то. вставляй (<[^>]+>)* между каждой буквой.

это не бред, это бардак. Но и с ним приходится работать.

mega_venik ★★★ ()
Ответ на: комментарий от anonymous

Плюс это является частным случаем варианта (2).

x3al ★★★★★ ()
Ответ на: комментарий от mega_venik

Почему ты решил, что эту задачу нужно решать регэкспами? Они тут никаким боком. Костыльно можно, но зачем?

x3al ★★★★★ ()
Ответ на: комментарий от x3al

ну и оно медленнее

В тз ничего не сказано про скорость.

что в ТЗ нет ничего о парсинге XML

есть:

docx

anonymous ()
Ответ на: комментарий от mega_venik

Только кодировать свой поиск, так?

Блжад, что там кодировать? Это кстати интересная бонусная задачка на тестовое ТЗ, хорошо будет отсеивать рукозадых.

anonymous ()
Ответ на: комментарий от x3al

Костыльно можно

Да почему костыльно? По - любому регекспы тут самый простой и быстрый вариант. Сама задача бредовая, это да, но она не сложная сама по себе. Наоборот, любое решение кроме регекспов тут — костыли.

sadlinuxoid ()
Ответ на: комментарий от anonymous

кроме как использовать XML

А ничего, что не всякий HTML является валидным XML? Ты можешь с XML - парсером не только подрочить, но и соснуть, внезапно, в своем гамаке.

sadlinuxoid ()
Ответ на: комментарий от sadlinuxoid

А ничего, что не всякий HTML является валидным XML?

Анонiмус никогда не отличался хорошей способностью читать, но мы к этому все привыкли, но даже если опустить docx, то я перепарсил кучу битого html-я xml-парсером.

anonymous ()
Ответ на: комментарий от sadlinuxoid

вставляй (<[^>]+>)* между каждой буквой.

Или ты думаешь, что строка поиска одна и известна заранее?

x3al ★★★★★ ()
Ответ на: комментарий от x3al

А почему она должна быть одной и известной заранее? Если он так сделает, он получит то что хотел, под шаблон будут попадать строки вида ма<br>ма мыла <br> раму

sadlinuxoid ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.