Удалить пробел между числом (случайным) и точкой с запятой (;) - PullRequest
2 голосов
/ 04 апреля 2020

С помощью функции Найти и заменить я хочу удалить пробел между числом (случайным) и точкой с запятой (;)

Например, 1025648950; 1025648950;

Однако, если там нет номера, я хочу, чтобы место осталось. Я не знаю, как правильно использовать подстановочные знаки в Word Find & Replace.

Это будет прямо в редакторе VBA.

With Selection.Find
  .Text = "[0-9] ;"
  .Replacement.Text = "[0-9];"
  .Forward = True
  .Wrap = wdFindStop
  .Format = False
  .MatchCase = False
  .MatchWholeWord = False
  .MatchWildcards = False
  .MatchSoundsLike = False
  .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll  

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Вам нужно сделать как минимум три вещи.

Укажите, что это поиск по шаблону, изменив

  .MatchWildcards = False

на

  .MatchWildcards = True

«Группировать» Найдите какое выражение, чтобы оно выглядело так:

  .Text = "([0-9]) (;)"

(Между ") (")

* 1013 стоит один пробел. Измените выражение "Заменить на", чтобы оно выглядело так:
  .Replacement.Text = "\1\2"

Как это работает, так это то, что каждый поисковый термин внутри () является выражением , которому присваивается номер 1, 2, ...

в .Replace. Текст, «\ 1» означает «использовать текст, которому соответствует выражение 1»

Так что «\ 1 \ 2» означает «использовать di git, который ([0-9]) соответствует», за которым следует « ;» что (;) совпадает, так что пространство в середине исключается.

0 голосов
/ 04 апреля 2020

Обычно это было бы легко, используя RegEx (регулярные выражения), но в вашем случае это сложнее, потому что вы хотите заменить ";" если он обработан числом, но оставьте его, если это не так. Единственный способ сделать это - разбить текст на коллекцию символов, а затем перебрать всю коллекцию:

Sub RemoveSpaces()
    Dim s As String
    s = Selection
    s = cleanSpaces(s)
    Selection = s
End Sub

Function cleanSpaces(s As String) As String
On Error Resume Next
    Dim regexNums As New RegExp
    Dim charCol As New Collection
    regexNums.Pattern = "[0-9]"

    'create collection with all characters from string.
    For Counter = 1 To Len(s)
        charCol.Add (Mid(s, Counter, 1))
    Next
    'loop through collection and remove number followed by space followed by semicolon.
    For i = 1 To charCol.Count
        If regexNums.Test(charCol(i)) Then 'if number
            If (charCol(i + 1) = " ") Then 'if next character is a space
                If (charCol(i + 2) = ";") Then 'if next char is a semicolon
                    charCol.Remove (i + 1) 'remove the space
                End If
            End If
        End If
    Next

    For i = 1 To charCol.Count
        cleanSpaces = (cleanSpaces & charCol(i))
    Next
End Function

Обратите внимание, что это будет выполняться только для выбранного текста в вашем документе. Если вы хотите запустить его на всем документе, нажмите Ctrl + A, чтобы выделить весь текст. Вот мои данные испытаний до и после: before

after

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...