Страницы: 1
RSS
Как добавить знак плюса после каждого 1 или 2 символьного слова или цифры?
 
Допустим есть фраза:
Ехал грека через реку, а там он увидел, что кто-то карабкается на берег.

Должно быть на выходе так:
Ехал грека через реку, а+там он+увидел, что кто-то карабкается на+берег.

Учитываются только буквы и цифры, другие символы игнор. Возможно ли так сделать или хотя бы подскажите как находить именно двух или односимвольный элемент
 
Цитата
vladimirr89 написал: Должно быть на выходе так
А логика какая?
Согласие есть продукт при полном непротивлении сторон
 
знак плюса после каждого 1 или 2 символьного слова или цифры.
 
Через Split разделить строку на отдельные слова, а дальше проверять каждое слово по длине  Len
 
Хорошо, спасибо!)
 
Цитата
Через Split разделить строку на отдельные слова, а дальше проверять каждое слово по длине  Len
Это будет разбивка только по пробелам. Игнор других символов не выйдет.
Выход единственный анализировать посимвольно (например с помощью Like), если буква или цифра - прибавлять счетчик. Если наткнулись на игнор-символ и счетчик больше 0, но меньше 3 - менять символ на "+".
Изменено: PerfectVam - 25.07.2017 20:09:06
Следствие из третьего закона Чизхолма:
"Даже если ясность изложения исключает неверное толкование, все равно найдется кто-то, кто поймет Вас неправильно."
 
ТС писал
Цитата
после каждого 1 или 2 символьного слова или цифры
 
Цитата
Kuzmich написал: ТС писал
Да, только я тоже это понял не как ОДНО и ДВУ, а как после ПЕРВОГО и ВТОРОГО
Согласие есть продукт при полном непротивлении сторон
 
учитывает не только буквы и цифры. если два в подряд 1 и,или 2 символьного слова или цифры(а там он у реки увидел), то второй пропускает. также пропускает, если предложение начинается с 1 или 2 символьного слова или цифры  
Код
=ЕСЛИОШИБКА(ЕСЛИ(ЕОШИБКА(ПОИСК(" ?? ";A1)+2);ПСТР(A1;1;ЕСЛИОШИБКА(ПОИСК(" ?? ";A1)+2;ПОИСК(" ? ";A1)+1))&"+"&ПСТР(A1;ЕСЛИОШИБКА(ПОИСК(" ?? ";A1)+2;ПОИСК(" ? ";A1)+1)+2;999);ПСТР(A1;1;ЕСЛИОШИБКА(ПОИСК(" ?? ";A1)+2;ПОИСК(" ? ";A1)+1))&"+"&ПСТР(A1;ЕСЛИОШИБКА(ПОИСК(" ?? ";A1)+2;ПОИСК(" ? ";A1)+1)+2;999));"")
в итоге
а учитывает не+только буквы и+цифры. если два в+подряд 1 и,+или 2+символьного слова или цифры а+там у+реки он+увидел, то+второй пропускает. также пропускает, если пр+и предложение начинается с+1 или 2+символьного слова или цифры  
 
Поскольку это SEO, то можно сначала заменить в строке все "ненужные" для поисковика символы (знаки препинания, например), на пробелы, а потом сделать сплит.

Кстати, а какая логика у такой подстановки? Мало того, что предлоги и союзы поисковик сам исключит из запроса (раз перед ними нет +) - так мы ещё и нарвёмся на принудительное включение некоторых ненужных слов: возьмите и обработайте фразу "а он и в ту не верит" :)

А, хотя да... правила построения поисковой фразы, напрямую используемой через URL/API, требуют присоединить стоп-слова плюсами...
Код
Function str2direct(ByVal s As String) As String
    Dim a
    s = WorksheetFunction.Trim(Replace(Replace(s, ".", " "), ",", " "))
    If Len(s) > 0 Then
        a = Split(s, " ")
        For i = UBound(a) To LBound(a) + 1 Step -1
                If Len(a(i - 1)) < 3 Then
                    a(i - 1) = a(i - 1) & "+" & a(i)
                    a(i) = ""
                End If
        Next
        s = WorksheetFunction.Trim(Join(a, " "))
    End If
    str2direct = s
End Function
Изменено: AndreTM - 25.07.2017 21:03:15
 
AndreTM,
по логике ТС должно быть а+он+и+в+ту+не+верит
 
вариант функции yyy  в C1 или uuu
Код
Function uuu$(t$)
   Dim i%, t1$
   With CreateObject("VBScript.RegExp"): .Global = True: .IgnoreCase = True
    .Pattern = "(?:[^-а-яё\d]|^)[-а-яё\d]{1,2}(?=[^-а-яё\d]|$)"
           t1 = .Replace(t, "$&+"): uuu = Replace(t1, "+ ", "+")
  End With
End Function


Код
Function yyy$(t$)
   Dim i%
   With CreateObject("VBScript.RegExp"): .Global = True: .IgnoreCase = True
    .Pattern = "(?:[^-а-яё\.,\d]|^)[-а-яё\.,\d]{1,2}(?=[^-а-яё\.,\d]|$)"
           yyy = .Replace(t, "$&+")
  End With
End Function
Изменено: sv2013 - 26.07.2017 05:35:47
 
sv2013,
Если макрос не найдет соответствий, то в ячейке будет пусто.
Я думаю, надо еще сделать проверку
Код
Function yyy$(t$)
   Dim i%
   With CreateObject("VBScript.RegExp"): .Global = True: .IgnoreCase = True
    .Pattern = "(?:[^-а-яё\.,\d]|^)[-а-яё\.,\d]{1,2}(?=[^-а-яё\.,\d]|$)"
    If .test(t) Then
       For i = 0 To .Execute(t).Count - 1
           yyy = .Replace(t, "$&+")
      Next
    Else
      yyy = t
    End If
  End With
End Function
Страницы: 1
Наверх