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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения, конфликт с символами 
V
    Опции темы
DENSHER
Дата 8.5.2011, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здрасте  smile 

Возникла некая проблема с Regex.Match, поскольку я новичок по этому направлению.
Я оперяюсь для поиска на переменную NamePlayer(Имя игрока), но когда в имени присутствую такие символы как: ?, ), ] ит.д совпадение не работает - пример ниже.

Строчка примера выглядит так: # 405 ""Найк > you player? o_O"" STEAM_0:1:11223344 25:35 22 0 active 87.255.14.67:27005
и таких строчек может набраться до 54:

В именах(никах) могут быть разные буквы, цифры, символы абракадабры - короче целый букет.
Код

# 306 "Assир !!!     Ash )" STEAM_0:0:18177962  1:52:19 65 0 active 213.224.228.249:27005
# 369 "mol/zl\" STEAM_0:0:33569201 41:52 102 0 active 71.126.17.12:27005
# 420 "I'm SEKTANT" STEAM_0:1:38378409 10:46 96 0 active 94.23.15.36:27005
# 439 "Инк" STEAM_0:1:10794835 00:01 57 70 spawning 118.123.230.31:58477
# 403 "shelby ORG" STEAM_0:1:27416719 26:44 57 0 active 118.23.31.3:45632
# 363 "Bals" STEAM_0:1:37666416 46:12 160 0 active 198.141.43.131:27005
# 425 "VooDoo68RUS" STEAM_0:0:5570626 06:41 109 0 active 44.18.41.147:27005
# 434 "[koMa]" STEAM_0:1:39744476 00:33 43 0 active 202.204.113.16:27005
# 438 "†●ЂάηķŘόββėŗ●�" STEAM_0:1:34757336 00:32 43 0 active 202.204.113.16:27005


Код

Dim SteamID As String = String.Empty
Dim Ips As String = String.Empty

Private Sub SrvConsole(ByVal text As String, ByVal type As Integer)
    text = text.Replace(Constants.vbLf, Constants.vbCrLf)
       If type = 0 Then ' Консоль
              If StatusPlayers = True Then
                   Dim TempStatus As String = text
                   Dim DelVblf As String = TempStatus.Replace(vbCrLf, "")
                   TempStatus = DelVblf
                   Dim match As Match = Regex.Match(TempStatus, _
                   "^(.+?) """ & NamePlayer & """ ((?:STEAM_\d:\d:\d+|BOT)) (.+?) active|spawning (.+?):(.+?)$")
                   SteamID = match.Groups(2).Value
                   Ips = match.Groups(4).Value
              End If
              ' продолжение кода убрано , он не относится к проблеме
       ElseIf type = 1 Then ' Логи
       ' продолжение кода убрано , он не относится к проблеме
       End If
End Sub


Возможно я что-то неправильно сделал? Если ,да! Подскажите правильно решение.
Если же все более или менее терпимо , то как обойти конфликтующие символы , все которые могут войти в конфликт (это меня наверное уже не туда несет).

Это сообщение отредактировал(а) DENSHER - 8.5.2011, 18:45
PM MAIL   Вверх
krewin
Дата 8.5.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А что так сделать нельзя

Код

 Dim testcell As String = "# 438 ""†●ЂάηķŘόββėŗ●�"" STEAM_0:1:34757336 00:32 43 0 active 202.204.113.16:27005" '  примерная строка где "" экранирует символ " 
        Dim dims() As String = Split(testcell, """")
        MsgBox(dims(1)) 'вот ник игрока без всяких фильтров

PM MAIL   Вверх
DENSHER
Дата 8.5.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



krewin, в своем примеры ты показал как найти имя в одной строчки,но это не то.
Я делаю поиск имени для получения SteamID и Ip-адреса.

Приблизительно должно происходить так:
Код

' Примерно так выглядит GiveText:
' # 306 "Assир !!!     Ash )" STEAM_0:0:18177962  1:52:19 65 0 active 213.224.228.249:27005
' # 369 "mol/zl\" STEAM_0:0:33569201 41:52 102 0 active 71.126.17.12:27005
' # 420 "I'm SEKTANT" STEAM_0:1:38378409 10:46 96 0 active 94.23.15.36:27005
' # 439 "Инк" STEAM_0:1:10794835 00:01 57 70 spawning 118.123.230.31:58477
' # 403 "shelby ORG" STEAM_0:1:27416719 26:44 57 0 active 118.23.31.3:45632
' # 363 "Bals" STEAM_0:1:37666416 46:12 160 0 active 198.141.43.131:27005
' # 425 "VooDoo68RUS" STEAM_0:0:5570626 06:41 109 0 active 44.18.41.147:27005
' # 434 "[koMa]" STEAM_0:1:39744476 00:33 43 0 active 202.204.113.16:27005
' # 438 "†●ЂάηķŘόββėŗ●�" STEAM_0:1:34757336 00:32 43 0 active 202.204.113.16:27005

Dim Text As String = GiveText ' объявляем переменную и получаем в нее текст

Dim Name AS String = "mol/zl\" ' имя игрока

' следующие действия:
' произвести поиск имени Name в переменной Text
' если имя найдено получить  его SteamID и Ip-адрес

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


Это сообщение отредактировал(а) DENSHER - 8.5.2011, 18:47
PM MAIL   Вверх
krewin
Дата 8.5.2011, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот 

Код

 Dim Text As String = " # 306 ""Assир !!!     Ash )"" STEAM_0:0:18177962  1:52:19 65 0 active 213.224.228.249:27005" & vbCr & _
        " # 369 ""mol/zl\"" STEAM_0:0:33569201 41:52 102 0 active 71.126.17.12:27005" & vbCr & _
        " # 420 ""I'm SEKTANT"" STEAM_0:1:38378409 10:46 96 0 active 94.23.15.36:27005" & vbCr & _
        " # 439 ""Инк"" STEAM_0:1:10794835 00:01 57 70 spawning 118.123.230.31:58477" ' получаем строку такого содержания

        Dim cell() As String = Split(Text, "#") 'разбиваем на строки
        Dim Name As String = "mol/zl\"

        For i = 0 To cell.Length - 1 'поиск по строчно
            If cell(i) = " " Then GoTo 1
            Dim d() As String = cell(i).Split("""")
            If d(1) = Name Then
                MsgBox("Найден игрок `" & Name & "` " & d(2))
                Exit Sub
            End If
1:
        Next
        MsgBox("Нет такого игрока тут")

PM MAIL   Вверх
DENSHER
Дата 9.5.2011, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Огромное спасибо  smile  и с меня + за твой труды smile

Это сообщение отредактировал(а) DENSHER - 9.5.2011, 00:25
PM MAIL   Вверх
diadiavova
Дата 10.5.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



DENSHER, а не проще ли хранить список в виде XML документа?


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


Бывалый
*


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

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



Список может обновляться каждую секунду , из-за этого XML не подходит.
PM MAIL   Вверх
diadiavova
Дата 11.5.2011, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(DENSHER @  11.5.2011,  07:13 Найти цитируемый пост)
Список может обновляться каждую секунду , из-за этого XML не подходит. 

В любом случае, искать по списку и извлекать из него инфу проще из хмл или из списка объектов, а не из текста.
Извлекать данные действительно проще регуляркой, поскольку ты сможешь в один проход получить все данные сразу и потом просто работать с ними. С составлением могу помочь, если ты объяснишь более детально, что означают данные в строках и что конкретно надо извлекать.


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


Бывалый
*


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

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



Я получаю с удаленного сервера на переменную(например textinfo) вот такой вот текст:
Код

hostname: GameServerSpb
version : 1.0.0.61/16 4565 secure  
udp/ip  :  212.76.131.41:27015
map     : de_dust2 at: 0 x, 0 y, 0 z
players : 5 (20 max)

# userid name uniqueid connected ping loss state adr
# 420 "I'm SEKTANT" STEAM_0:1:38378409 10:46 96 0 active 94.23.15.36:27005
# 439 "Инк" STEAM_0:1:10794835 00:01 57 70 spawning 118.123.230.31:58477
# 403 "shelby ORG" STEAM_0:1:27416719 26:44 57 0 active 118.23.31.3:45632
# 363 "Bals" STEAM_0:1:37666416 46:12 160 0 active 198.141.43.131:27005
# 425 "VooDoo68RUS" STEAM_0:0:5570626 06:41 109 0 active 44.18.41.147:27005

затем, я из списка игроков(с элемента ListPlayer) выбираю имя и ищу его в переменной textinfo. После нахождения имени мне нужно, получить STEAM_0:0:XXXXXXX и ip-адрес(без порта) - в зависимости от выбора (эти данные нужны для блокировки игрока(ban))

Например - я ищу имя Bals в переменной textinfo и после нахождения я получаю его STEAM_0:1:37666416 46:12 и 198.141.43.131 и после этого я могу выбрать как этого игрока забанить, по SteamID или ip-адресу!

Вот такая вот картинка вырисовывается.
PM MAIL   Вверх
diadiavova
Дата 11.5.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Значит так... Регулярное выражение объявишь следующим образом
Код

    Dim playerRegex As New Regex("\#\s\d+\s""(?<name>.+)""\s" & _
                    "(?<steam>STEAM_[\d:]+\s[\d:]+).+(?<ip>(\d{1,3}\.){3}\d{1,3}):\d+")

Дальше его методу Mathes передашь свой список и получишь список игроков в виде списка объектов Match. Чтобы удобнее было работать с игроками создай специальную структуру Player
Код

Public Structure Player
    Public Name, Steam, Ip As String
End Structure

Преобразовать найденные соответствия в список игроков можно с помощью простого линк-запроса (покажу в виде функции)
Код

    Function GetPlayers(textList As String) As IEnumerable(Of Player)
        Return From m As Match In playerRegex.Matches(textList)
         Select New Player With {
         .Name = m.Groups("name").Value,
         .Ip = m.Groups("ip").Value,
         .Steam = m.Groups("steam").Value}
    End Function

Имея список в виде коллекции игроков можно легко найти кого угодно, к примеру с помощью линковского метода FirstOrDefault
Код

        Dim players = GetPlayers(playerList)
        Dim player = players.FirstOrDefault(Function(x) x.Name = textinfo)
        Dim ip = player.Ip
        Dim steam = player.Steam

Это в любом случае лучше, чем рыскать по тексту(тем более, что в этом случае все равно придется потом разбирать строку)


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


Бывалый
*


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

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



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

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

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


 




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


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

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