![]() |
|
Модераторы: diadiavova, gambit |
![]()
|
|
| asj |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
Есть набор строк типа:
Word [abc] .Any word... Word [abc] a [a[bc]] bc [a[bc]d] ... нужно их завернуть в теги. значение имеют первое слово в каждой строке, квадратные скобки, точка первым символом. Вывод должен получиться такой [tag1]Word[/tag1] [tag2][abc][/tag2] [tag3].Any word...[/tag3] [tag1]Word[/tag] [tag2][abc][/tag2] a [tag2][a[bc]][/tag2] bc [tag2][a[bc]d][/tag2] 1) первое слово строк оборачивается в теги [tag1]Word [/tag1] 2) если первый символ в строке точка, то вся строка без изменений внутри оборачивается в др. тег [tag3] 3) ну и символы в квадратных скобках тоже оборачиваются тегом, причем внутри одних кв. скобок могут быть и другие, нужно обернуть их одним блоком типа [tag2][a[bc]][/tag2] я поковырял и слепил для 1): (вроде пашет) Src = Regex.Replace(Src, "\n(\s*)([A-Za-z0-9]+)", "$1[tag1]$2[/tag1]") для 2): (вроде тоже, но [/tag3] пихает на новую строку, пробовал указать $ в кач.ве конца строки не хочет его хавать) Src = Regex.Replace(Src, "(\..*\r)", "[tag3]$1[/tag3]") для 3) в случае одиночных скобок сделал, но с вложенными вообще ниче не выходит... Помогите правильно составить паттерны для таких замен? до этого приходилось играться с регулярками на элементарном уровне... заранее спасибо. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
asj, Пара уточнений:
1. Набор строк представляет из себя один текст или они у тебя в программе являются разными объектами? 2. Если строка начинается с точки, то ее всю надо заключить в один тег, не взирая на возможное наличие квадратных скобок? -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| asj |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) asj - 26.11.2011, 14:42 |
||||
|
|||||
| diadiavova |
|
||||||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Тогда еще один момент: под первым символом подразумевается первый символ в строке и заключать в тег надо все, вплоть до окончания строки? То есть текст поделен на строки и можно анализировать каждую строку отдельно? А если нет, то каковы признаки начала и конца, к примеру строки с точкой. Ну то есть, если попадется строка типа
Как это должно выглядеть на выход: так
или так
Это сообщение отредактировал(а) diadiavova - 26.11.2011, 14:57 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||||||
|
|||||||||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Относительно примера с вложенными квадратными скобками вот
Если под строкой, начинающейся с точки, подразумевается действительно строка текста(то есть она заканчивается символами vbNewLine), то можно разбирать весь текст вообще построчно и если строка начинается с точки, то ее можно заключить в нужные теги безо всяких регулярок. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| asj |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
именно, так я и делал, проходился поочередно разл. паттернами по всем строкам текста. Выглядит не особо эффективно, но работает...
заключать в тег надо включая точку и до конца строки. Я специально обратил внимание на последний момент, т.к. сделал только с захватом символа перевода строки в конце строки с точкой. В итоге часть замыкающей замены перемещалась на след строку, типа: [tag3].def[gh] [/tag3][tag1]Word[/tag1] структура строк должна сохраняться, т.е. [tag3].def[gh][/tag3] [tag1]Word[/tag1] иначе можно напороть всякого...
значение имеет только точка как первый символ исходной строки, тогда вся строка берется неизменной в тег. Если в строке попадается точка в любом другом месте, то точка ничего не значит, обычный символ |
||||||
|
|||||||
| asj |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
одиночные скобки берет корректно, а в составных забывает последнюю: Word [abc] a [a[bc] bc [a[bc] d тогда уж: Word [abc] a [a[bc]] bc [a[bc]d] Добавлено через 9 минут и 9 секунд p.s: а вообще я чтото не знаю, как красиво должен выглядеть построчный анализ текста с регуляркой, и эффективно ли это мучает вопрос. Я пробую мутить сразу, с заменой во всем обьеме текста: Src = Regex.Replace(Src, "", "") Src = Regex.Replace(Src, "", "") ... так каждым паттерном. Пробовал намутить (скобки) со String.Replace но результаты "смешения" итогов такой замены с итогом работы регулярок не убедили, поэтому решил Regex сочинять... |
|||
|
||||
| diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
asj, попробуй так, вроде работает
Выдает вот что
Добавлено через 4 минуты и 40 секунд
Разбиваешь текст на строки и обходишь каждую регуляркой На до тестировать(если речь о производительности). На небольших текстах в любом случае расход ресурсов будет небольшим. Можно разделять все разные конструкции вертикальной чертой и объединять в именованные группы, после чего обходить найденные совпадения и проверять наличие той или иной группы. Звучит сложно, но для сложных примеров это лучшее решение ИМХО. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||
|
|||||||
| asj |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
ага, но нужны только совпадения со скобками, их потом заменить же надо.
ну ладно, постараюсь и так попробовать... |
||||||
|
|||||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Ну так это еще проще: удали из моей регулярки все, начиная с вертикальной черты. Я из первого поста понял, что надо и все остальное тоже отлавливать. А заменить ведь не проблема, посмотри перегрузку метода реплейс, где надо в качестве замены передавать делегат. Там просто надо будет написать функцию, которая проверяет, что заменяет, после чего возвращает строку замены. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| asj |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
ага спасибо, код мне читабельнее чем слова )
вроде все ясно, если что не получится в итоге, я еще спрошу, ок? |
|||
|
||||
| asj |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
такс... а в результате такого подхода я не вижу как сделать чтобы замена
[tag1]Word[/tag1] работала только один раз (паттерн править?) ((
т.е. заменить нужно только первое слово строки от начала строки до первого пробела (начало и конец слова, после пробела могут быть абс. любые символы), а остальное не трогать, ну и чтобы точка вначале не стояла Это сообщение отредактировал(а) asj - 27.11.2011, 17:00 |
|||
|
||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Да так же как и с точкой, просто вот такую финтифлюшку поставь перед группой txt
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| asj |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.11.2011 Репутация: нет Всего: нет |
поменял для Word в шаблоне вместо \n\r поставил \s (слово же до пробела идет иначе в тег попадал мусор например кавычки "):
[tag1]Word "[/tag1] добавил еще один тег и группу. но теперь остался последний вопрос - слова Word могут начинаться не с начала строки а с пробела(ов), ну короче с пустого места неизвестной длины (может и таб хотя нет вряд ли). после моей переделки с \s слово в этом случае не попадает в теги (( |
|||
|
||||
![]()
|
| Правила форума VB .NET | |
|
|
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |