Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > разделить 2 части


Автор: company05 3.3.2011, 15:26
Доброе времени суток! У меня такая проблема, я хочу разделить полученный текст на 2 части, ключом является знак *. Первая часть идет, а вот вторая часть не получается вытащить. Это код для поиска Вот мой код для второй части:
Текст храниться в ListBox1
Код

 Dim count As Integer = (ListBox1.Items.Count - 1)
                    Dim words1 As String = ""
                    Dim words As String = ""
                    If txtFind.Text <> "" Then
                        For a = 0 To count
                            words = ListBox1.Items.Item(a)
                            words1 = Mid(words, 1, InStrRev(words, "*"))
                            If InStr(words1.ToLower, txtFind.Text.ToLower) Then
                                txtRichVivod.Font = (New Font("Times New Roman", 14))
                                txtRichVivod.ForeColor = Color.Black
                                txtRichVivod.Text = txtRichVivod.Text & Trim(Mid(words, 1, InStr(words, "*") - 1)) & vbLf
                                txtRichVivod.Text = txtRichVivod.Text & vbTab & Trim(Mid(words, InStr(words, "*") + 1)) & vbLf & vbLf & vbLf
                            End If
                        Next


Помогите разобраться?

Автор: diadiavova 3.3.2011, 18:49
Код

Dim source = "Text before star*Text after star"
Dim starIndex = source.IndexOf("*")
Dim txtBefore = source.Substring(0, starIndex) 
Dim txtAfter = source.Substring(StarIndex + 1)

Автор: company05 3.3.2011, 20:38
C InStrRev не вариант будет?

Автор: diadiavova 3.3.2011, 20:49
Цитата(company05 @  3.3.2011,  20:38 Найти цитируемый пост)
C InStrRev не вариант будет? 

Видишь ли, все эти функции, достались из VB6 и в принципе поддерживаются, в первую очередь, ради совместимости с ним. Можно использовать и их, они ничем не хуже родных дотнетовских, но лучше все-таки использовать методы класса String. Я в принципе эти старые функции не особенно хорошо и знаю, поэтому, если тебе непременно надо использовать их, то это не ко мне вопрос.
А чем мой вариант не подходит? smile 

Автор: company05 3.3.2011, 21:49
Здесь у меня они как массив идут. Я здесь я попробовал что то не получилось у меня

Автор: diadiavova 3.3.2011, 22:07
Цитата(company05 @  3.3.2011,  21:49 Найти цитируемый пост)
Здесь у меня они как массив идут

И? С каждым элементом так надо работать.

Цитата(company05 @  3.3.2011,  21:49 Найти цитируемый пост)
 Я здесь я попробовал что то не получилось у меня 

Что именно не получилось? smile 

Короче сделай два метода расширителя класса String, это будет выглядеть так( в отдельном файле желательно)
Код

Imports System.Runtime.CompilerServices

Module Extensions
    <Extension()>
    Function SubstringBefore(ByVal this As String, ByVal separator As String) As String
        Return this.Substring(0, this.IndexOf(separator))
    End Function

    <Extension()>
    Function SubstringAfter(ByVal this As String, ByVal separator As String) As String
        Return this.Substring(this.IndexOf(separator) + 1)
    End Function
End Module



Дальше, везде, где этот модуль доступен ты сможешь эти методы вызывать так
Код

s.SubstingBefore("*")
s.SubstringAfter("*")

Тут s - строка, содержащая звездочку. Первое выражение выдаст тебе все, что до звездочки, второе - все что после. Если методы окажутся недоступными где-то, то надо будет импортировать в код пространство имен, в котором ты определишь этот модуль.

Автор: company05 3.3.2011, 22:58
Спасибо! Получилось!

Автор: krewin 9.3.2011, 20:54
Я очень часто использую разделители в тексте поэтому я разработал две функции, которые мне облегчили жизнь.

Код

Function Exploid(ByVal Simb_ As String, ByVal Text_ As String, ByVal Put_ As Integer) As String
        Dim i As Integer
        Put_ = Put_ - 1
        For i = 1 To Put_
            If InStr(Text_, Simb_) = 0 Then GoTo 10
            Text_ = Mid(Text_, InStr(Text_, Simb_))
            Text_ = Mid(Text_, Len(Simb_) + 1)
        Next i
        If InStr(Text_, Simb_) = 0 Then
        Else
            Text_ = Left(Text_, InStr(Text_, Simb_) - 1)
        End If
10:
        Exploid = Text_
    End Function

    Function Exploid_Put(ByVal Simb_ As String, ByVal Text_ As String) As Integer
        Dim i As Integer
        Dim t As Integer
        t = 0
        For i = 1 To 1000
            If InStr(Text_, Simb_) = 0 Then GoTo 10
            t = t + 1
            Text_ = Mid(Text_, InStr(Text_, Simb_) + Len(Simb_) + 1)
        Next i
10:
        Exploid_Put = t + 1
    End Function


Exploid("[тут указываем разделитель он может быть как один символ так и более, неиспользуемый символ в русском языке это Ъ используй его]",[строка для поиска содержащая текст],[тут указываем ряд]) - эта функция возвращает текст разделителя

Exploid_Put("[тут указываем разделитель он может быть как один символ так и более, неиспользуемый символ в русском языке это Ъ используй его]",[строка с разделителем]) - эта функция показывает сколько разделителей всего

вот пример 

Код

dim a as string = "Слово1*Слово2*Слово3"
msgbox (Exploid("*",a,2)) ' извлекет Слово2


или

files - имеет значение путь к файлу
Код

Exploid("\", files, Exploid_Put("\", files))' вернет только имя файла

Автор: diadiavova 9.3.2011, 21:09
Цитата(krewin @  9.3.2011,  20:54 Найти цитируемый пост)
dim a as string = "Слово1*Слово2*Слово3"
msgbox (Exploid("*",a,2)) ' извлекет Слово2

А чем String.Split не устраивает?
Код

MsgBox("Слово1*Слово2*Слово3".Split("*")(1))

Цитата(krewin @  9.3.2011,  20:54 Найти цитируемый пост)
вернет только имя файла

Для этого есть класс System.IO.Path, в нем есть методы для работы с путями, а вообще тот же сплит справится.

Автор: krewin 10.3.2011, 19:48
Это один из нескольких способов. (exploid аналог в php)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)