Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > VB .NET > Выделение подстрок из строки |
Автор: error0x40 17.6.2013, 17:47 | ||
Примеры строк: 1. Type ( "Name 1" ) 2. Engine( Name ) 3. Class ( Name Folder ) 4. Wagon ( "Name" "Folder") 5. Discrete_Trigger ( 53 PlayOneShot ( 2 File ( "Name" -1 ) File ( "Name2" -1 ) SelectionMethod ( RandomSelection ) ) ) На выходе нужно получить следующее 1. "Name 1" 2. Name 3. Name Folder 4. "Name" "Folder" 5. "Name" "Name2" Все корректно работает кроме 5 позиции: "Name" -1 "Name2" -1 SelectionMethod ( RandomSelection Приведу код самой функции
Подскажите пожалуйста, что именно упустил из виду? П.С. Приветствуются любые альтернативные варианты на PB. |
Автор: Akina 18.6.2013, 08:11 |
1) Вложенные скобки (вернее, они должны соответствовать друг другу в паттерне) 2) Набор символов, который не может быть в составе подстроки (возможно, в определённой позиции, напр. не начинаться xc цифры или дефиса) 3) Специальные подстроки, требующие исключения Как я понимаю, в 5-м примере должно получиться "Name" "Name2" RandomSelection? |
Автор: diadiavova 18.6.2013, 11:05 |
Достаточно сложно советовать, в силу того, что ты не объяснил саму задачу. Из примеров, конечно же, можно кое-что понять, но полной ясности все-таки нет. Мне вообще вариант с заменой части паттерна кажется немного странным, особенно если учесть, что само выражение у тебя предельно простое, я предполагаю, что можно все вместить в один паттерн и ничего не заменять. Например, если т.н. аргумент состоит из известных символов, то можно его просто описать регуляркой. В случае, если он может состоять из любых символов, то регулярка вообще может накрыться. Поэтому надо бы ввести какое-то ограничение. Например, во всех твоих примерах то, что ты назвал аргументом состоит из алфавитно-цифровых символов и подчеркиваний. Ну это ведь можно описать простейшей регуляркой \w+. Если тебе надо выбрать содержимое скобок, то тут тоже все предельно просто и такая регулярка будет выглядеть так [^\(\)]+. Ну и далее аналогично, то есть надо точно сформулировать правила отбора, а потом уже сочинять регулярку. |
Автор: error0x40 18.6.2013, 15:13 | ||||
Akina на выходе следовало получиться: "Name" "Name2" diadiavova
Как синтаксически грамотно описать РВ - вот в чем загвоздка. Ладно на время забудем, что аргументы могут быть разными. Критерии выбора подстроки: 1.Начало подстроки - слово(Argument) + пробел со скобкой/скобка (Например: 'Argument (' либо 'Argument(' ) 2. "В середине подстроки" могут присутствовать символы алфавита, цифры и символы: / \ . _ - " (пробел) 2.Конец подстроки - пробел с закрывающей скобкой Вот код рабочии, но необходимо оптимизировать
Не понятно следующее как сделать, что бы поиск соответствовал выше описанным критерия, но при это критерии начала и конца игнорировались оставалось лишь значение? Т.е. как описать в одном РВ так, что бы из строки например "Argument ( "\Value_.0" ) получить только "\Value_.0" Есть еще такая вот трактовка: Как объединить действия 7 и 11 строки в одну. |
Автор: Akina 18.6.2013, 16:45 |
Не понимаю, чем они лучше RandomSelection |
Автор: error0x40 18.6.2013, 17:59 | ||||||||||||
Используется конкретное слово(Argument), т.е. \w в данном случае не подойдет.
Если обратить внимание на вот это строчку, том можно увидеть где выражение " -1" удаляется из результата:
А насчет 5-го результата то вот строки отвечающие за вывод 2-х значений
Во это, что мне нужно было, про группы я забыл т.к. давно не работал с PB. Спасибо
Символ \s тоже не подходит так как в подстроке встречается только пробел. Кстати проверил мой старый код с использование стандарных функции и новый написаный с помощь РВ. Вот результат: Простые функции С использование РВ По времени(Tick) одинаковое Количество срок кода 45 23 |
Автор: diadiavova 18.6.2013, 23:54 | ||||||||
Насколько я понял, ему нужны не все вхождения текста в скобках, а только те, которым предшествует конкретный аргумент.
Ну почему не подойдет? А если так?
Если обратить, то конечно, только когда задаешь вопрос наверно как-то неправильно вынуждать тех, кто готов помочь, угадывать что тебе надо по коду, который к тому же еще и работает не так как надо. Все-таки проблему надо сформулировать словами, а код обычно служит для пояснения.
Ну его заменить пробелом тоже не проблема. Можно просто пробел ставить, но это не подойдет, если установить флажок IgnorePatternWhitespaces. В примере выше я использовал более универсальный подход.
Если ты не приводишь самих тестов и что тестировал, то эти результаты вообще ни о чем не говорят. Они просто непонятны. |
Автор: error0x40 21.6.2013, 18:58 |
Всем спасибо. |