Автор Тема: [RegExp] Объединение похожих стилей  (Прочитано 4684 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7831
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Имеем строку:
<span class="S5">If</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13">></span><span class="S13">=</span> <span class="S3">20</span> <span class="S5">And</span> <span class="S4">StringRight</span><span class="S13">(</span><span class="S9">$iYears</span><span class="S13">,</span> <span class="S3">1</span><span class="S13">)</span> <span class="S13">=</span><span class="S13">=</span> <span class="S3">2</span><span class="S13">)</span> <span class="S5">Or</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13"><</span>
Нужно получить следующее:
<span class="S5">If</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13">>=</span> <span class="S3">20</span> <span class="S5">And</span> <span class="S4">StringRight</span><span class="S13">(</span><span class="S9">$iYears</span><span class="S13">,</span> <span class="S3">1</span><span class="S13">) ==</span> <span class="S3">2</span><span class="S13">)</span> <span class="S5">Or</span> <span class="S13">(</span><span class="S9">$iYears</span> <span class="S13"><</span>
Т.е нужно заменить в строке такое совпадение:
<span class="S13">></span><span class="S13">=</span>
на это:
<span class="S13">>=</span>если ещё точнее, то нужно убрать идущие подряд одинаковые стили, в этом случае стиль S13 повторяется два раза, поэтому один стиль нужно удалить.

Могут встречаться и такие стили:
<span class="S13">></span> <span class="S13">=</span>
и тогда добавленный пробел должен учитываться при удалении, он должен попасть между двумя символами:
<span class="S13">> =</span>
Я пробовал по всякому, вот примерно так:

Код: AutoIt [Выделить]
$vTest = StringRegExpReplace($sLine, '(?si)<span class="S(\d+)">([^(?:</?span)]*)</span><span class="S\1">(.*?)</span>', '<span class="S\1">\2\3\4</span>')


но оно не полностью заменяет :(.

Есть идеи у кого?


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

[RegExp] Объединение похожих стилей
« Отправлен: Апрель 04, 2010, 09:00:49 »

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: [RegExp] Объединение похожих стилей
« Ответ #1, Отправлен: Апрель 04, 2010, 19:14:17 »
хде-то так:

Код: AutoIt [Выделить]
StringRegExpReplace($sLine, '(?i)(?<=(<span class="S\d">))(?>(.*?)</span>)( *)\1|(?<=(<span class="S\d\d">))(?>(.*?)</span>)( *)\4', '\2\3\5\6')


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7831

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: [RegExp] Объединение похожих стилей
« Ответ #2, Отправлен: Апрель 04, 2010, 20:14:32 »
Мда, сразу чувствуется, тут был спец. по регулярным выражениям! :laugh:

Супер, спасибо!

P.S
У меня лично получилось(?) двумя заходами:

Код: AutoIt [Выделить]
$sLine = StringRegExpReplace($sLine, '(?i)(<span class="S(\d+)">)([^(?:</?span)]*)(</span>)<span class="S\2">(.*?)</span>', '\1\3\5\4')
$sLine = StringRegExpReplace($sLine, '(?i)(<span class="S(\d+)">)([^</]*)(</span>)(\s+)<span class="S\2">(.*?)</span>', '\1\3\5\6\4')



Добавлено: Апрель 04, 2010, 20:51:59
Если кому то интересно зачем оно мне надо, скажу следующее: Я пишу собственный парсер для раскраски синтаксиса кода на AutoIt, парсер в принципе готов, вот только бы оптимизировать его рег. выражения, которые надо заметить, работают медленнее чем хотелось бы :(...
« Последнее редактирование: Апрель 04, 2010, 20:51:59 от CreatoR, Причина: Объединение сообщений »

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: [RegExp] Объединение похожих стилей
« Ответ #3, Отправлен: Апрель 05, 2010, 04:19:41 »
У меня лично получилось(?) двумя заходами
если заметил, у меня тоже два искусственно объединенных выражения -  для одно-/двухзначных номеров стилей
...если подумать, то можно их слить в одно:

Код: AutoIt [Выделить]
StringRegExpReplace($s,'(?i)(?<=(<span class="S))(?>((\d++)">.*?)</span>)( *+)\1\3">','\2\4')


"слабое звено" в твоём варианте: "[^(?:</?span)]*" и "[^</]*"  :whistle:

пишу собственный парсер для раскраски синтаксиса кода на AutoIt
гм... тогда откуда сами эти стили?

вот только бы оптимизировать его рег. выражения, которые надо заметить, работают медленнее чем хотелось бы
ну если ты возьмешь на себя труд оформить регекспы с комментами, как в этом топике, готов подключиться к обсуждению по мере возможности  ;)
« Последнее редактирование: Апрель 05, 2010, 05:04:09 от amel27 »

Русское сообщество AutoIt

Re: [RegExp] Объединение похожих стилей
« Ответ #3 Отправлен: Апрель 05, 2010, 04:19:41 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7831

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: [RegExp] Объединение похожих стилей
« Ответ #4, Отправлен: Апрель 05, 2010, 06:29:18 »
amel27  [?]
Цитировать
если подумать, то можно их слить в одно
А оно не будет в ущерб скорости?

Цитировать
тогда откуда сами эти стили?
Я их написал для конечного html, это будут CSS-стили.

Цитировать
если ты возьмешь на себя труд оформить регекспы с комментами, как в этом топике, готов подключиться к обсуждению по мере возможности
Супер!
У меня уже в принципе всё готово, коменты везде есть (правда на английском), я буду рад если поможешь оптимизировать, особенно RegExp'сы на предмет ускорения :)

Позже буду выкладывать в примерах, ещё бы правда это решить :whistle:...

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: [RegExp] Объединение похожих стилей
« Ответ #5, Отправлен: Апрель 05, 2010, 11:23:31 »
А оно не будет в ущерб скорости?
тест показал, что последний вариант получился в 1,5-2 раза быстрее

Цитировать
тогда откуда сами эти стили?
Я их написал для конечного html, это будут CSS-стили.
я не силен в веб-технологиях, поэтому (если не сложно) объясни в двух словах: что к чему прикручивается, а главное - причем тут AutoIT?..  :wacko:

У меня уже в принципе всё готово, коменты везде есть (правда на английском)
хорошо бы в форме: одна задача -> один топик, и само собой, на русском  :)

ещё бы правда это решить
ок, гляну

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7831

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: [RegExp] Объединение похожих стилей
« Ответ #6, Отправлен: Апрель 05, 2010, 11:39:09 »
amel27  [?]
Цитировать
объясни в двух словах: что к чему прикручивается, а главное - причем тут AutoIT?
Ну как, autoit генерирует html-код (подсветка синтаксиса), и в процессе гененрации каждому тегу присваивается некий класс (свойство/поведение тега), этот класс, а точнее все нужные классы (от 1 до 15-ти) позже будут добавлены в файл каскадных таблиц стилей (что называется CSS), и сгенерированный html-код будет считывать эти стили, и соотв-енно выводить код с подсвеченным синтаксисом. Я добавил также поддержку конвертирования в BBCode, вот там уже никакие стили не используются, просто значения стилей конвертируются в теги BB-кода.

Цитировать
хорошо бы в форме: одна задача -> один топик, и само собой, на русском
Не уверен что поонял, но это будет одна тема, а точнее один проект :). Я вот вот добавляю систему отладки регулярных выражении, где в консоль будут выводиться все шаблоны, плюс комены к ним.

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: [RegExp] Объединение похожих стилей
« Ответ #7, Отправлен: Апрель 05, 2010, 12:55:24 »
Не уверен что понял, но это будет одна тема, а точнее один проект

я о том, что по ходу работы над проектом могут возникать разные интересные частные задачи, обсуждение которых имеет смысл выносить в отдельные темы... то же самое можно отнести к уже решенным задачам, но которым не помешает оптимизация кода и/или времени выполнения

Русское сообщество AutoIt

Re: [RegExp] Объединение похожих стилей
« Ответ #7 Отправлен: Апрель 05, 2010, 12:55:24 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
7 Ответов
3427 Просмотров
Последний ответ Ноябрь 27, 2011, 00:46:07
от agikon
3 Ответов
6586 Просмотров
Последний ответ Март 25, 2012, 01:22:03
от asdf8
14 Ответов
6940 Просмотров
Последний ответ Июль 03, 2012, 00:48:36
от Garrett
1 Ответов
1476 Просмотров
Последний ответ Ноябрь 14, 2013, 22:02:27
от AZJIO
2 Ответов
918 Просмотров
Последний ответ Декабрь 28, 2014, 16:17:35
от gloss
21 Ответов
3455 Просмотров
Последний ответ Май 05, 2015, 10:15:40
от forc1k
3 Ответов
954 Просмотров
Последний ответ Ноябрь 24, 2016, 17:58:33
от LazyShd
9 Ответов
1725 Просмотров
Последний ответ Март 29, 2017, 01:16:14
от CreatoR
15 Ответов
1824 Просмотров
Последний ответ Июнь 19, 2017, 06:45:58
от Alofa
11 Ответов
1096 Просмотров
Последний ответ Октябрь 04, 2017, 20:24:48
от RipVanWinkel