Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение подстрок из строки 
V
    Опции темы
error0x40
Дата 17.6.2013, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.2.2012

Репутация: нет
Всего: нет



Примеры строк:
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

Приведу код самой функции

Код

   Function GetStore(ByVal Text As String, ByVal Argument As String)
        Dim pattern As String = "Argument\s\(\s.*\s\)|Argument\(\s.*\s\)"
        Dim PatRepl As String = "Argument\s\(\s|Argument\(\s|\s\)"
        Dim Temp As String = Nothing

        'Замена слова Argument на реальный аргумент
        pattern = pattern.Replace("Argumnet", Argument)
        PatRepl = PatRepl.Replace("Argument", Argument)
        'Выделение аргумента со значением
        Temp = Regex.Match(Text, pattern).Value
        'Выделить только значение
        Temp = Regex.Replace(Temp, PatRepl, "")
        Return Temp
    End Function


Подскажите пожалуйста, что именно упустил из виду?

П.С. Приветствуются любые альтернативные варианты на PB.


Это сообщение отредактировал(а) error0x40 - 17.6.2013, 17:49
PM MAIL   Вверх
Akina
Дата 18.6.2013, 08:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(error0x40 @  17.6.2013,  18:47 Найти цитируемый пост)
что именно упустил из виду?

1) Вложенные скобки (вернее, они должны соответствовать друг другу в паттерне)
2) Набор символов, который не может быть в составе подстроки (возможно, в определённой позиции, напр. не начинаться xc цифры или дефиса)
3) Специальные подстроки, требующие исключения

Как я понимаю, в 5-м примере должно получиться "Name" "Name2" RandomSelection?



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
diadiavova
Дата 18.6.2013, 11:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(error0x40 @  17.6.2013,  18:47 Найти цитируемый пост)
П.С. Приветствуются любые альтернативные варианты на PB.

Достаточно сложно советовать, в силу того, что ты не объяснил саму задачу. Из примеров, конечно же, можно кое-что понять, но полной ясности все-таки нет. Мне вообще вариант с заменой части паттерна кажется немного странным, особенно если учесть, что само выражение у тебя предельно простое, я предполагаю, что можно все вместить в один паттерн и ничего не заменять.
Например, если т.н. аргумент состоит из известных символов, то можно его просто описать регуляркой. В случае, если он может состоять из любых символов, то регулярка вообще может накрыться. Поэтому надо бы ввести какое-то ограничение. Например, во всех твоих примерах то, что ты назвал аргументом состоит из алфавитно-цифровых символов и подчеркиваний. Ну это ведь можно описать простейшей регуляркой \w+. Если тебе надо выбрать содержимое скобок, то тут тоже все предельно просто и такая регулярка будет выглядеть так [^\(\)]+. Ну и далее аналогично, то есть надо точно сформулировать правила отбора, а потом уже сочинять регулярку.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
error0x40
Дата 18.6.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.2.2012

Репутация: нет
Всего: нет



Akina
на выходе следовало получиться:
"Name" "Name2"

diadiavova
Цитата

то есть надо точно сформулировать правила отбора, а потом уже сочинять регулярку. 

Как синтаксически грамотно описать РВ - вот в чем загвоздка.

Ладно на время забудем, что аргументы могут быть разными.

Критерии выбора подстроки:
1.Начало подстроки - слово(Argument) + пробел со скобкой/скобка (Например: 'Argument (' либо 'Argument('  )
2. "В середине подстроки" могут присутствовать символы алфавита, цифры и символы: / \ . _ -  " (пробел)  
2.Конец подстроки - пробел с закрывающей скобкой

Вот код рабочии, но необходимо оптимизировать
Код

    Function GetStore(ByVal Text As String, ByVal Argument As String)
        Dim pattern As String = Argument & "\ \(\ .*?\ \)|" & Argument & "\(\ .*?\ \)"
        Dim PatRepl As String = Argument & "\ \(\ |" & Argument & "\(\ |\ \)| -1"
        Dim Temp As String = Nothing
        Dim Temp2 As String = Nothing
        'Выделение аргумента со значением
        Temp = Regex.Match(Text, pattern, RegexOptions.IgnoreCase).ToString
        Temp2 = Regex.Match(Text, pattern, RegexOptions.IgnoreCase).NextMatch.ToString
        If Temp2 <> Nothing Then Temp &= "|" & Temp2
        'Выделить только значение
        Temp = Regex.Replace(Temp, PatRepl, "", RegexOptions.IgnoreCase)
        Return Temp
    End Function


Не понятно следующее как сделать, что бы поиск соответствовал выше описанным критерия, но при это критерии начала и конца игнорировались оставалось лишь значение?
Т.е. как описать  в одном РВ так, что бы из строки например "Argument ( "\Value_.0" )  получить только "\Value_.0"
Есть еще такая вот трактовка: Как объединить действия  7  и 11 строки в одну.


Это сообщение отредактировал(а) error0x40 - 18.6.2013, 18:16
PM MAIL   Вверх
diadiavova
Дата 18.6.2013, 15:56 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(error0x40 @  18.6.2013,  16:13 Найти цитируемый пост)
Начало подстроки - слово(Argument)

Означает ли это, что оно состоит только из алфавитно-цифровых символов? Если да, то вполне подойдет \w+ .
Цитата(error0x40 @  18.6.2013,  16:13 Найти цитируемый пост)
1.Начало подстроки - слово(Argument) + пробел со скобкой/скобка (Например: 'Argument (' либо 'Argument('  )
2. "В середине подстроки" могут присутствовать символы алфавита, цифры и символы: / \ . _ -  " (пробел)  
2.Конец подстроки - пробел с закрывающей скобкой

Допустим. Тогда не очень понятно, каким образом из пятого варианта получится представленный тобой результат. В частности меня интересует, куда делись подстроки "-1" (дважды) и "RandomSelection". Кроме того, интересно, следует ли объединять все полученные результаты в одну строку, как это у тебя описано в варианте 5. Ведь  "Name" и "Name2" находятся не рядом.
Так вообще по описанному получается примерно следующее
Код

\w+\s?([\w\/\\\.\-]+\s\)
Естественно, для извлечения именно содержимого скобок надо его заключить в именованную группу и именно ее и искать в результатах
Код

\w+\s?\((?<result>[\w\/\\\.\-]+)\s\)
То, что я написал - не готовая регулярка, а просто набросок, который скорей всего еще надо будет отладить. Символы \s обозначают не только проблелы, но и табуляции и новую строку( Chr(10) ) и возврат каретки (Chr(13)). Ну и соответственно вопросы, которые задал выше, тоже надо учесть.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Akina
Дата 18.6.2013, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(error0x40 @  18.6.2013,  16:13 Найти цитируемый пост)
Akina
на выходе следовало получиться:
"Name" "Name2"

Не понимаю, чем они лучше RandomSelection


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
error0x40
Дата 18.6.2013, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.2.2012

Репутация: нет
Всего: нет



Цитата(diadiavova @  18.6.2013,  15:56 Найти цитируемый пост)
Означает ли это, что оно состоит только из алфавитно-цифровых символов? Если да, то вполне подойдет \w+ .

Используется конкретное слово(Argument), т.е. \w в данном случае не подойдет.

Цитата(diadiavova @  18.6.2013,  15:56 Найти цитируемый пост)
Допустим. Тогда не очень понятно, каким образом из пятого варианта получится представленный тобой результат. В частности меня интересует, куда делись подстроки "-1" (дважды) и "RandomSelection". Кроме того, интересно, следует ли объединять все полученные результаты в одну строку, как это у тебя описано в варианте 5. Ведь  "Name" и "Name2" находятся не рядом.

Если обратить внимание на вот это строчку, том можно увидеть где выражение " -1" удаляется из результата:

Код

Dim PatRepl As String = Argument & "\ \(\ |" & Argument & "\(\ |\ \)| -1"

А насчет 5-го результата то вот строки отвечающие за вывод 2-х значений

Код

        Temp2 = Regex.Match(Text, pattern, RegexOptions.IgnoreCase).NextMatch.ToString
        If Temp2 <> Nothing Then Temp &= "|" & Temp2


Цитата(diadiavova @  18.6.2013,  15:56 Найти цитируемый пост)
Естественно, для извлечения именно содержимого скобок надо его заключить в именованную группу и именно ее и искать в результатах

Во это, что мне нужно было, про группы я забыл т.к. давно не работал с PB. Спасибо

Цитата(diadiavova @  18.6.2013,  15:56 Найти цитируемый пост)
То, что я написал - не готовая регулярка, а просто набросок, который скорей всего еще надо будет отладить. Символы \s обозначают не только проблелы, но и табуляции и новую строку( Chr(10) ) и возврат каретки (Chr(13)). Ну и соответственно вопросы, которые задал выше, тоже надо учесть. 

Символ \s тоже не подходит так как в  подстроке встречается только пробел.

Кстати проверил мой старый код с использование стандарных функции и новый написаный с помощь РВ.
Вот результат:
                                     Простые функции                         С использование РВ
По времени(Tick)                                        одинаковое
Количество срок  кода               45                                                     23


Это сообщение отредактировал(а) error0x40 - 18.6.2013, 18:08
PM MAIL   Вверх
diadiavova
Дата 18.6.2013, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(Akina @  18.6.2013,  17:45 Найти цитируемый пост)
Не понимаю, чем они лучше RandomSelection 

Насколько я понял, ему нужны не все вхождения текста в скобках, а только те, которым предшествует конкретный аргумент.
Цитата(error0x40 @  18.6.2013,  18:59 Найти цитируемый пост)
Используется конкретное слово(Argument), т.е. \w в данном случае не подойдет.

Ну почему не подойдет? А если так?
Код

    Function GetStore(text As String, arg As String) As String
        Dim pattern = "(?<argument>\w+)\x20?\(\x20?(?<result>[\""\w\/\\\.\-]+)(\x20-1)?\x20\)"
        Dim re As New Regex(pattern, RegexOptions.Compiled Or RegexOptions.IgnoreCase)
        Dim matches = From m As Match In re.Matches(text) Where m.Groups("argument").Value = arg Select m.Groups("result").Value
        Return String.Join(" ", matches.ToArray)
    End Function

Цитата(error0x40 @  18.6.2013,  18:59 Найти цитируемый пост)
Если обратить внимание на вот это строчку

Если обратить, то конечно, только когда задаешь вопрос наверно как-то неправильно вынуждать тех, кто готов помочь, угадывать что тебе надо по коду, который к тому же еще и работает не так как надо. Все-таки проблему надо сформулировать словами, а код обычно служит для пояснения.
Цитата(error0x40 @  18.6.2013,  18:59 Найти цитируемый пост)
Символ \s тоже не подходит так как в  подстроке встречается только пробел.

Ну его заменить пробелом тоже не проблема. Можно просто пробел ставить, но это не подойдет, если установить флажок IgnorePatternWhitespaces. В примере выше я использовал более универсальный подход.
Цитата(error0x40 @  18.6.2013,  18:59 Найти цитируемый пост)
Кстати проверил мой старый код с использование стандарных функции и новый написаный с помощь РВ.

Если ты не приводишь самих тестов и что тестировал, то эти результаты вообще ни о чем не говорят. Они просто непонятны.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
error0x40
Дата 21.6.2013, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.2.2012

Репутация: нет
Всего: нет



Всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0823 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.