svfolder
Постоялец
- Регистрация
- 31 Июл 2013
- Сообщения
- 159
- Реакции
- 156
- Автор темы
- #1
Ищется нормальный рабочий алгоритм размножения текста по шаблону.
Нашел один алгоритм, но он оказался рабочим на 30%, не умеет работать с шаблонами в которых несколько подстановочных блоков типа {aaa|ssss|cccc}{rrr|tttt|yyyyy}
Вот он.
Взял его за основу и начал перерабатывать, добрался до получения 2х массивов, массив блоков замен и массив того на что каждый из блоков надо заменить.
Далее вынос мозга и непонятно как перемножить массивы и заменить текст чтобы вышло все верно.
Ниже привожу метод.
Нашел один алгоритм, но он оказался рабочим на 30%, не умеет работать с шаблонами в которых несколько подстановочных блоков типа {aaa|ssss|cccc}{rrr|tttt|yyyyy}
Вот он.
Скрытое содержимое доступно для зарегистрированных пользователей!
Взял его за основу и начал перерабатывать, добрался до получения 2х массивов, массив блоков замен и массив того на что каждый из блоков надо заменить.
Далее вынос мозга и непонятно как перемножить массивы и заменить текст чтобы вышло все верно.
Ниже привожу метод.
Код:
Function Permutation(ByVal oldlist As ArrayList)
Dim emp As New List(Of String)
emp.Add(String.Empty)
Dim result As New ArrayList
Dim KeyVal As New Dictionary(Of String, String)
For i = 0 To oldlist.Count - 1
Dim mthColl As MatchCollection = Regex.Matches(oldlist(i), "{(.*?)}")
If mthColl.Count > 0 Then
For Each Item As Match In mthColl
Dim all As String()() = {}
Dim cnt As Integer = 0
Dim allMatches As String() = {}
Dim tmpItem As Match = Item
While tmpItem.Success
cnt += 1
'-----------------------------
ReDim Preserve all(cnt - 1)
all(cnt - 1) = tmpItem.Groups(1).Value.ToString.Split("|")
'-----------------------------
'-----------------------------
ReDim Preserve allMatches(cnt - 1)
allMatches(cnt - 1) = tmpItem.Value
'-----------------------------
tmpItem = tmpItem.NextMatch
End While
'-----------------------------
Dim cntVariant As Integer = 0
For vCount = 0 To all.Count - 1
Dim tmpArrVariant = all(vCount)
Dim currMatch = allMatches(vCount)
For Each tmpVariant As String In tmpArrVariant
KeyVal.Add(tmpVariant, currMatch)
Next
Next
'-----------------------------
'-----------------------------
For Each matchReplace As String In allMatches
Dim str As String = oldlist(i).ToString
Dim len As Integer = str.Length
Dim delKey As String = ""
For Each Item1 As KeyValuePair(Of String, String) In KeyVal
str = str.Replace(Item1.Value, Item1.Key)
If str.Length <> len Then
delKey = Item1.Key
Exit For
End If
Next
result.Add(str)
'KeyVal.(delKey)
Next
Dim x = KeyVal
'-----------------------------
'' Перебираем блоки которые надо заменить
'For Each matchReplace As String In allMatches
' ' Перебираем массив вариантов замен
' For Each arrVariant As String() In all
' ' Перебираем варианты замен
' For Each strVariant As String In arrVariant
' Dim spl As String = strVariant.Trim()
' KeyVal.Add(spl, matchReplace)
' Next
' Next
'Next
'-----------------------------
Next
Else
result.Add(oldlist(i))
End If
Next
Return result
End Function