2015-05-15 5 views
1

Что мне нужно сделать, это добавить знак плюс + перед каждым предлогом в ячейке? По какой-то причине \b не будет работать для меня.Границы слов Excel VBA (замена предлогов)

В JavaScript, он должен работать нормально:

(\bof\b|\bat\b) 
//change with 
+$1 

Но VBA скрипт в Excel с тем же регулярным выражением ничего не соответствует.

Пример:

И отдохнуть от них было для него спасением от мук. 

Результат должен быть:

И отдохнуть +от них было +для него спасением +от мук. 

Обратите внимание, что "отдохнуть" слово имеет "от" внутри. Сам

код (взято где-то здесь):

Sub ReplaceWithRe() 
Dim re As Object 'RegExp 
Dim rng As Range, cl As Range 
Dim sh As Worksheet 
Dim wb As Workbook 
Dim sReplace As String 
Dim aReplace(0 To 1, 0 To 1) As String 
Dim i As Long 

Set wb = ActiveWorkbook 
Set re = CreateObject("vbscript.regexp") ' New RegExp 
re.Global = True 
re.IgnoreCase = False 
re.MultiLine = True 

' Load array of patterns and replacements 
aReplace(0, 0) = "(\bот\b|\bдля\b)" 
aReplace(0, 1) = "+$1" 

For Each sh In wb.Worksheets 
    On Error Resume Next 
    Set rng = sh.UsedRange.SpecialCells(xlCellTypeConstants) 
    If Err.Number <> 0 Then 
     Err.Clear 
    Else 
     On Error GoTo 0 
     For Each cl In rng 
      sReplace = cl.Value 
      ' Test each cell for each pattern, replace when found 
      For i = 0 To UBound(aReplace, 1) 
       re.Pattern = aReplace(i, 0) 
       If re.Test(sReplace) Then 
        sReplace = re.Replace(sReplace, aReplace(i, 1)) 
       End If 
      Next 
      cl.Value = sReplace 
     Next 
    End If 
Next 
End Sub 

Я думаю, что я получил подсказку. Похоже, что это регулярное выражение отлично работает с латинскими символами, но с кириллицей оно не возвращает совпадений. Я обновил пример.

+0

Ваш код для нас, чтобы проверить? –

+0

@JLILIAmen код добавлен –

+1

Для данного рисунка нет совпадений. Это должно быть: aReplace (0, 0) = "(\ bon \ b \ \ bwith \ b)" для вашего образца текста. – Rory

ответ

1

Что касается кириллицы, то вы должны знать, что в соответствии с Regular-expressions.info, VBScript регулярное выражение имеет

поддержка

Нет Unicode, для согласования отдельных символов с

Итак, \b матчи в не только граница слова и кириллические буквы не являются словами для двигателя регулярных выражений VBScript!

Единственный выход, чтобы расширить \b, как это, например .:

strPattern = "(\s|^)(от|для)(\s|$)" 
str = "Отдохнуть от них было для него спасением от мук и прекрасным отдыхом." 
strReplace = "$1+$2$3" 

Я думаю, что мы можем безопасно использовать пробелы в качестве разделителей, поскольку предлоги обычно не следуют пунктуации. Вы можете добавить знаки препинания в первой части, хотя (на всякий случай):

strPattern = "([\s,:;]|^)(от|для)(\s|$)" 

Выход:

Отдохнуть +от них было +для него спасением +от мук и прекрасным отдыхом. 
+0

Не работает. "\ b (of | at) \ b" –

+0

Согласен, '' \ b (of | at) \ b "' не работает. '' \ b (on | with | of | at) \ b "' работает. –

+0

Я получил вас, пример здесь был всего лишь примером. Спасибо за ваше «не в нужном месте» иронию. Пример обновлен, мне действительно нужно это для кириллических символов, и похоже, что \ b отлично работает для меня, когда я использую латинский символ/латинскую строку. Но когда я использую русские символы, он перестает работать. –

Смежные вопросы