Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 05.02.2010 18:15:40
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Тема: Определение конца строки
Благодарю за грамотный, познавательный, интереснейший сайт. Наткнулся на него пару недель назад, с жадностью впитываю новую для себя информацию…
Дабы не обременять однотипными вопросами админов пытался найти ответ на интересующую меня тему, но не найдя, решил-таки обратиться с вопросом…
Увлёкся форматированием текста (использую замену, в т. ч. в необходимых случаях с использованием подстановочных знаков). Коснулся вопросов расстановки пробелов. Повсеместная расстановка неразрывных пробелов после предлогов, союзов и частиц (далее — ПСЧ) визуально портит текст ввиду особенности этого неразрывного пробела — он нерастягиваемый. Поэтому решил, что было бы неплохо расставлять их только в конце строки.
Вопрос:
Как определить конец строки, которую завершает ПСЧ, и проставить в этом случае неразрывный пробел перед этими ПСЧ? Если не трудно, приведите, пожалуйста, пример такового кода макроса.
2 Ответ от Вождь 05.02.2010 18:52:09
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Определение конца строки
Поможет функция:
Она возвращает True в месте, где текст переходит на следующую строку. Не путать с концом строки! Например, если вставлен символ разрыва строки, то Selection.IPAtEndOfLine=False.
Для перемещения в конец строки к подойдет функция:
Selection.EndOf Unit:=Word.wdLine, Extend:=Word.wdMove
Как перейти на следующую строку думаю догадаетесь…
P.S. Я писал похожий макрос, но до концов строк не додумался. Зато реализовал прикрепление: номеров (Глава 1, 2 место и т.п.), союзов и частиц, крайних слов (в конце предложения, перед/после скобки, кавычки и т.п.)
Макросы под заказ и готовый пакет — mtdmacro.ru
3 Ответ от Penniwise 09.02.2010 16:16:52
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
К сожалению, мои познания в VBA пока ещё недостаточны для того, чтобы сделать это самому. Вынужден снова обращаться к Вам за помощью. Имеется вот такой нижеприведённый код. За основу взят код неизвестного мне разработчика.
Sub SimpleReplace(what, forwhat, checkCase)
exitPoint = False
With Selection
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindContinue
.MatchCase = checkCase
.MatchWildcards = False 'NEW
.Execute Replace:=wdReplaceAll
If Not .Found Then
exitPoint = True
End If
End With
End With
End Sub
...
If MsgBox("Проставить неразрывный пробел после предлогов?", 308, "Шаг 5 из 6") = vbYes Then
SimpleReplace " в ", " в^s", True
SimpleReplace " о ", " о^s", True
SimpleReplace " к ", " к^s", True
SimpleReplace " от ", " от^s", True
SimpleReplace " с ", " с^s", True
' и так далее нужное мне количество вариантов букв
...
End If
Как я понял, в начале макроса определяется некая процедура SimpleReplace, которая в дальнейшем с успехом применяется в нужном количестве раз.
Ума не приложу, честно говоря, куда «всунуть» эту самую Selection.IAPtEndOfLine.
Можно ли её в саму процедуру SimpleReplace включить?
Задача состоит в том, чтобы после этих букв проставлять «неразрывный пробел» ТОЛЬКО, если они находятся в конце строки и после них стоит «пробел».
Буду благодарен, если подскажете, где могу подробнее про это почитать?
Отредактировано Penniwise (09.02.2010 16:22:48)
4 Ответ от Вождь 09.02.2010 18:50:58
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 1
Re: Определение конца строки
Вот замена функции SimpleReplace, делающая замены только в конце строк:
Sub SimpleReplaceAtEndOfLine(what, forwhat, checkCase)
exitPoint = False
With Selection
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindStop
.MatchCase = checkCase
.MatchWildcards = False
Do While .Execute(Replace:=wdReplaceNone)
exitPoint = True
Dim L&, N&
L = Selection.Characters.Count
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
If (N = 1) And Selection.IPAtEndOfLine Then
Selection.MoveEnd Unit:=Word.wdCharacter, Count:=1 - L - N
.Execute Replace:=wdReplaceOne
Else
Selection.MoveEnd Unit:=Word.wdCharacter, Count:=2 - L - N
End If
Loop
End With
End With
End Sub
Непонятно для чего у вас переменная exitPoint. Я ее воткнул приблизительно. В следующий раз выкладывайте весь код или компилируемый фрагмент.
Почитать могу посоветовать только Help по VBA встроенный в Word.
Макросы под заказ и готовый пакет — mtdmacro.ru
5 Ответ от Penniwise 09.02.2010 19:48:08
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
Не получилось.
Выкладываю весь макрос.
Изначальный код не мой, я просто разместил объяву, поэтому возможны переменные, смысл которых я пока не знаю. Главное, что я знаю, что они мне пока не мешают, а код я доработал и он функционирует, в принципе, как мне нужно. Исключение составляет лишь этот противный конец строки.
Искомая задача ставится в шаге 5, 6.
Post’s attachments
Tipografic.bas 20 Кб, 9 скачиваний с 2010-02-09
You don’t have the permssions to download the attachments of this post.
6 Ответ от Вождь 09.02.2010 20:08:34
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Определение конца строки
Penniwise пишет:
Не получилось…
Да, работать не будет.
Подправьте начало моей процедуры:
Sub SimpleReplaceAtEndOfLine(what, forwhat, checkCase)
With Selection
.SetRange 0, 0
With .Find
...
Макросы под заказ и готовый пакет — mtdmacro.ru
7 Ответ от Penniwise 09.02.2010 23:18:04
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
Работает!!! (смайлик с выпученными глазами)
Огромное спасибо!!!
8 Ответ от Penniwise 05.03.2010 11:48:07
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
С момента внедрения данной функции в макрос работать стало приятнее.
Однако, выявлен баг — макрос, выполняя свои итерации, вешает процесс winword.exe, вынуждая жёстко его завершать. Происходит это в случае, когда в документе присутствуют перекрёстные ссылки, оглавление. Курсор «добегает» до какой-нибудь перекрестной ссылки (как правило текстовой и, предположительно, содержащей в себе буквосочетание, которое ищет макрос) и останавливается, продолжая очень часто моргать.
С чем это может быть связано? Как это ликвидировать?
Отредактировано Penniwise (05.03.2010 11:48:38)
9 Ответ от Вождь 05.03.2010 14:35:27
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 1
Re: Определение конца строки
Penniwise пишет:
..выявлен баг … в случае, когда … присутствуют … ссылки…
Модификация под ссылки и т.п.:
Sub SimpleReplaceAtEndOfLine(what, forwhat , checkCase)
With Selection
.SetRange 0, 0
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindStop
.MatchCase = checkCase False
.MatchWildcards = False
Do While .Execute(Replace:=wdReplaceNone)
Dim R As Word.Range
Dim EOL As Boolean
Dim N&
Set R = Selection.Range
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
R.Select
If (N = 1) And EOL Then
Selection.Collapse Direction:=Word.wdCollapseStart
.Execute Replace:=wdReplaceOne
Else
Selection.Collapse Direction:=Word.wdCollapseEnd
End If
Loop
End With
End With
End Sub
Отредактировано Вождь (05.03.2010 14:37:38)
Макросы под заказ и готовый пакет — mtdmacro.ru
10 Ответ от Penniwise 12.03.2010 11:14:44
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
Благодарю. Теперь работает.
Теперь буду сам пытаться разобраться, как сделать, чтобы после отработки макросом этой его части, курсор и экран возвращался бы в то место, с которого он начал выполнение.
11 Ответ от andrkar 15.03.2010 19:34:18
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
- За сообщение: 1
Re: Определение конца строки
может подойдет такое решение для возврата:
1. Добавление закладки
With CurrentDoc.Bookmarks
.Add Range:=Selection.Range, Name:=»Имя_закладки» ‘Добавление закладки
.DefaultSorting = wdSortByName
.ShowHidden = False
End With
2. Переход к нужной закладке
Selection.GoTo What:=wdGoToBookmark, Name:=»Имя_закладки»
Selection.Find.ClearFormatting
With Selection.Find
.Forward = True
.Wrap = wdFindContinue
End With
3. Удаление закладки
CurrentDoc.Bookmarks(«Имя_закладки»).Delete ‘ Удаление закладки
12 Ответ от viter.alex 15.03.2010 21:01:20
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
Re: Определение конца строки
Поясню пример andrkar. Т.е. перед выполнением действий с документом, нужно поставить закладку в то место, где находится курсор, а затем, когда всё сделаем, перейти к этой закладке и удалить её.
Эта часть кода для перехода к закладке не нужна:
With Selection.Find
.Forward = True
.Wrap = wdFindContinue
End With
Лучше день потерять — потом за пять минут долететь!
13 Ответ от andrkar 15.03.2010 21:22:47
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
Re: Определение конца строки
Вождь
.MatchCase = checkCase False
у меня vb на данную строку ругается…
14 Ответ от viter.alex 15.03.2010 21:32:05
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
- За сообщение: 1
Re: Определение конца строки
False удали
Лучше день потерять — потом за пять минут долететь!
15 Ответ от Penniwise 25.03.2010 17:01:24
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
На сообщение от 15.03.2010 20:34:18:
По поводу CurrentDoc.Bookmarks у меня говорит, что Variable not defined.
А как что её определить я не знаю.
16 Ответ от andrkar 25.03.2010 19:01:13
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
Re: Определение конца строки
Ну конечно будет выдавать.. Нужно еще вот что сделать:
Dim CurrentDoc As Document
Set CurrentDoc = ActiveDocument
17 Ответ от aequit 08.02.2017 10:53:16
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Вождь пишет:
Модификация под ссылки и т.п.:
Столкнулся с необходимостью поиска и замены в конце строки с использованием Wildcards. Если изменяю код из 9 сообщения на
то макрос выполняется только до первого совпадения и потом завершается. Как заставить его продолжать работу?
И ещё, можно ли ограничить диапазон поиска и замены только выделением, так как
сразу переносит курсор в начало документа и начинается обработка всего текста документа
18 Ответ от Вождь 08.02.2017 12:04:26
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 1
Re: Определение конца строки
aequit пишет:
…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…
Откуда ж я знаю, не видя ВАШЕГО кода
Хотя бы ВАШИ значения what и forwhat сообщите.
Макросы под заказ и готовый пакет — mtdmacro.ru
19 Ответ от aequit 08.02.2017 12:48:16
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Вождь пишет:
aequit пишет:
…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…
Откуда ж я знаю, не видя ВАШЕГО кода
Хотя бы ВАШИ значения what и forwhat сообщите.
Sub test1()
SimpleReplaceAtEndOfLine1 "([Нн]а)( )", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(what, forwhat)
With Selection
.SetRange 0, 0
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindStop
.MatchCase = False
.MatchWildcards = True
Do While .Execute(Replace:=wdReplaceNone)
Dim R As Word.Range
Dim EOL As Boolean
Dim N&
Set R = Selection.Range
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
R.Select
If (N = 1) And EOL Then
Selection.Collapse Direction:=Word.wdCollapseStart
.Execute Replace:=wdReplaceOne
Else
Selection.Collapse Direction:=Word.wdCollapseEnd
End If
Loop
End With
End With
End Sub
Если «На» или «на» и после пробел стоят в конце строки, нужно пробел заменить на неразрывный пробел…
Доходит до первого совпадения и останавливается
Можно ли ограничить поиск конкретным диапазоном или выделением, чтобы по всему документу не отрабатывал?
20 Ответ от Вождь 08.02.2017 14:38:38
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 3
Re: Определение конца строки
Для заданной области и подстановочных знаков, где-то так:
Sub test1()
ActiveDocument.ActiveWindow.View.Type = wdPrintView
'ActiveDocument.Range(0, 0).Select
SimpleReplaceAtEndOfLine1 Selection.Range, "(<[Нн]а)([ ]@<)", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = What
.Replacement.Text = ForWhat
End With
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
End If
Loop
End Sub
Учтите, что после вставки неразрывного, ваше НА перескочит на следующую строку. Значит, концом строки может стать другое «НА», что стояло перед этим НА. НАдеюсь понятно
Макросы под заказ и готовый пакет — mtdmacro.ru
21 Ответ от aequit 08.02.2017 15:54:57
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Вот теперь работает с Wildcards и только вы нужном месте, не лезет по всему документу, спасибо!
22 Ответ от Forthwalker 21.01.2020 15:54:11
- Forthwalker
- рядовой
- Неактивен
- Зарегистрирован: 21.01.2020
- Сообщений: 3
Re: Определение конца строки
Вождь, спасибо большое!
Немножко переработал Ваш код, дополнив его справочником предлогов (в массиве arrWhat, однобуквенные слова там же, в конце) трёхкратным прогоном макроса и проверкой на выделение (останавливает, если обрабатываемый текст не выделен). Надеюсь пригодится народу.
Я — дилетант, потому код не эталонный, возможна критика за неэффективные или некрасивые решения.
Sub PerenosPredlogov() ActiveDocument.ActiveWindow.View.Type = wdPrintView 'ActiveDocument.Range(0, 0).Select SimpleReplaceAtEndOfLine1 Selection.Range, "", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
If FindRange.Duplicate = "" Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Dim arrWhat
arrWhat = Array("(<[Нн]а)", "(<[Ии]ли)", "(<[Вв]о)", "(<[Вв]иду)", "(<[Вв]опреки)", "(<[Вв]след)", "(<[Вв]следствие)", "(<[Дд]ля)", "(<[Дд]о)", "(<[Ии]з)", "(<[Ии]з-за)", "(<[Зз]а)", "(<[Ии]сключая)", "(<[Кк]о)", "(<[Кк]роме)", "(<[Нн]а)", "(<[Мм]ежду)", "(<[Нн]ад)", "(<[Нн]е)", "(<[Оо]б)", "(<[Оо]бо)", "(<[Оо]коло)", "(<[Оо]т)", "(<[Пп]еред)", "(<[Пп]о)", "(<[Пп]од)", "(<[Пп]ред)", "(<[Пп]ри)", "(<[Пп]ро)", "(<[Пп]ротив)", "(<[Пп]ри)", "(<[а-яА-Яa-zA-Z]{1})")
Dim i As Integer
i = 1
For i = 1 To 3
For Each mark In arrWhat
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = mark & "([ ]@<)"
.Replacement.Text = ForWhat
End With
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
End If
Loop
Next
i = i + 1
Next
End Sub
23 Ответ от Forthwalker 21.01.2020 16:13:17
- Forthwalker
- рядовой
- Неактивен
- Зарегистрирован: 21.01.2020
- Сообщений: 3
Re: Определение конца строки
Может прошлое сообщение отправилось на модерацию, а я этого не понял (тогда прошу простить), потому повторю.
Немножко переделал код Вождя. Добавлен справочник предлогов + однобуквенные слова (массив arrWhat), трёхкратный прогон всего кода. Не профессионал, делал под свои нужды, надеюсь пригодится
Sub PerenosPredlogov()
ActiveDocument.ActiveWindow.View.Type = wdPrintView
'ActiveDocument.Range(0, 0).Select
SimpleReplaceAtEndOfLine1 Selection.Range, "", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
If FindRange.Duplicate = "" Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Dim arrWhat
arrWhat = Array("(<[Нн]а)", "(<[Ии]ли)", "(<[Вв]о)", "(<[Вв]иду)", "(<[Вв]опреки)", "(<[Вв]след)", "(<[Вв]следствие)", "(<[Дд]ля)", "(<[Дд]о)", "(<[Ии]з)", "(<[Ии]з-за)", "(<[Зз]а)", "(<[Ии]сключая)", "(<[Кк]о)", "(<[Кк]роме)", "(<[Нн]а)", "(<[Мм]ежду)", "(<[Нн]ад)", "(<[Нн]е)", "(<[Оо]б)", "(<[Оо]бо)", "(<[Оо]коло)", "(<[Оо]т)", "(<[Пп]еред)", "(<[Пп]о)", "(<[Пп]од)", "(<[Пп]ред)", "(<[Пп]ри)", "(<[Пп]ро)", "(<[Пп]ротив)", "(<[Пп]ри)", "(<[а-яА-Яa-zA-Z]{1})")
Dim i As Integer
i = 1
For i = 1 To 3
For Each mark In arrWhat
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = mark & "([ ]@<)"
.Replacement.Text = ForWhat
End With
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
End If
Loop
Next
i = i + 1
Next
End Sub
24 Ответ от Forthwalker 10.02.2020 14:19:29
- Forthwalker
- рядовой
- Неактивен
- Зарегистрирован: 21.01.2020
- Сообщений: 3
Re: Определение конца строки
Переделал код. Теперь словарь на виду (можно редактировать), и код отрабатывает правильно. Добавил подсчёт переносов, отображение прогресса (в статус баре) и финальное сообщение.Советую добавлять код в шаблон Normal, чтобы был доступен во всех документах.
Dim RC As Integer
Sub PerenosPredlogov()
If VBA.Len(Selection.Range.Text) = 0 Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
ActiveDocument.ActiveWindow.View.Type = wdPrintView
Application.ScreenUpdating = False
Dim FRange As Word.Range
Set FRange = Selection.Range
Dim arrWhat
Dim What$, i As Byte, p%, h%, prog%
'список членов предложения для переноса
arrWhat = Array(0, "на", "во", "виду", "вопреки", "вслед", "для", "до", "из", "из-за", "за", "ко", "кроме", "на", "между", _
"над", "не", "об", "обо", "около", "от", "перед", "по", "под", "пред", "при", "про", "против", "со", "то", "да", "даже", _
"едва", "если", "затем", "либо", "когда", "как", "однако", "отчего", "перед", "пока", "после", "потому", "так", "также", "тем", _
"тоже", "тогда", "хотя", "чем", "что", "чтоб", "чтобы", "не", "ни", "это", "или") ', "поскольку", "исключая", "вследствие", "притом", "причем")
'переменные для отображения прогресса
p = 0
h = (UBound(arrWhat) + 1) * 3
prog = 0
RC = 0
Application.StatusBar = "Выполнено: 1 %" & ". Количество переносов: " & RC
i = 1
For i = 1 To 3
For Each mark In arrWhat
If mark <> 0 Then
What = "(<[" & UCase(Left(mark, 1)) & Left(mark, 1) & "]" & Mid(mark, 2) & ")([ ]@<)" 'обработка предлогов для regex
Else
What = "(<[а-яА-Яa-zA-Z]{1})([ ]@<)" 'одиночные символы
End If
SimpleReplaceAtEndOfLine1 FRange, What, "1^s"
'счёт прогресса
p = p + 1
prog = p / h * 100
Application.StatusBar = "Выполнено: " & prog & "%" & ". Количество переносов: " & RC
Next
DoEvents
Next i
MsgBox "Выполнено! " & " Количество переносов: " & RC
Application.ScreenUpdating = True
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = What
.Replacement.Text = ForWhat
End With
' поиск
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
RC = RC + 1
End If
DoEvents
Loop
End Sub
25 Ответ от aequit 21.01.2021 11:33:32
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Столкнулся с неправильной работой процедуры SimpleReplaceAtEndOfLine1 в случае, если после предлога в конце строки стоит кавычка. Не срабатывает, если, например, в конце строки стоит предлог
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
У Word есть мощные возможности поиска, которые позволяют искать вам текст, числа, форматы, параграфы, разрывы страниц, использовать подстановочные символы, коды полей и многое другое. Используя подстановочные символы, вы можете искать просто всё что угодно в вашем документе. Поскольку функция поиска совмещена с заменой, то вы можете также выполнять весьма замысловатые преобразования текста.
Прежде чем мы приступим, поясню пару терминов, которые могут быть не совсем понятными для вас.
Регулярное выражение — это условное обозначение критериев, которым должна соответствовать искомая строка. С помощью регулярных выражений можно найти множество строк или слов, соответствующих заданным условиям.
Подстановочные символы (wildcards) — это * (звёздочка), . (точка) и ? (знак вопроса), которые имеют в регулярных выражениях специальное значение. Например, символ * (звёздочка) обозначает любое количество любых символов, а ? (знак вопроса) означает любой один символ.
Давайте начнём знакомство с продвинутыми возможностями поиска в Word!
Как использовать подстановочные символы в продвинутом поиске
В ленте Word переключитесь на вкладку «Главная» и нажмите кнопку «Заменить»:
В окне «Найти и заменить» кликните «Больше >>», чтобы развернуть диалоговое окно и увидеть дополнительные опции. Если вы увидели кнопку «<< Меньше», значит всё прошло удачно.
В раскрывшемся окне для показа опций поиска, включите флажок «Подстановочные знаки».
Обратите внимание, что после того, как вы включили опцию «Подстановочные знаки», Word сразу под полем «Найти:» показывает, что эта опция включена. Также когда выбран флажок «Подстановочные знаки», некоторые опции становятся недоступными для включения, а именно: «Учитывать регистр», «Только слово целиком», «Учитывать префикс», «Учитывать суффикс».
Теперь нажмите кнопку «Специальный» для просмотра списка подстановочных знаков.
В Word доступны следующие подстановочные символы:
Символ | Значение |
---|---|
? | Любой знак |
[-] | Символ в диапазоне |
< | В начале слова |
> | В конце слова |
() | Выражение — единая последовательность символов. Также применяется для обратных ссылок |
[!] | Не |
{;} | Число вхождений |
@ | Предыдущий 1 или более |
* | Любое число знаков |
^t | Знак табуляции |
^^ | Знак крышки |
^n | Знак столбца |
^+ | Длинное тире |
^= | Короткое тире |
^g | Графический объект |
^l | Разрыв строки |
^m | Разрыв страницы / раздела |
^~ | Неразрывный дефис |
^s | Неразрывный пробел |
^- | Мягкий перенос |
Наконец выберите подстановочный символ для вставки в ваши критерии поиска. После выбора подстановочного знака, символ добавляется в строку поиска. Когда запомните значения, вы также можете использовать клавиатуру для ввода символов вместо вставки их путём выбора из списка. Меню «Специальный» работает как справка в случае если вы не помните, какие доступны специальные символы и их значения.
Готовые увидеть как работают подстановочные символы? Давайте ознакомимся с конкретными примерами использования регулярных выражений и подстановочных символов в Word.
Для чего используются подстановочные символы?
В меню «Специальный» содержит много специальных символов, которые вы можете использовать для поиска по документу Word, но на самом деле не все они являются подстановочными символами. Большинство из них нужны для поиска каких-то специфичных и, иногда, скрытых символов Word, таких как пробелы, разного вида тире, разрывы страницы.
Здесь мы заострим внимание в первую очередь на подстановочных знаках, которые означают один или более символов текста или модифицируют поиск на основе другого символа в вашем поиске.
Использование звёздочки для указания любого количества символов
Скорее всего, самым часто используемым подстановочным символом для вас станет звёздочка. Она означает, что вы хотите найти любое количество символов. Например, чтобы найти все слова, начинающиеся с «отм», напечатайте «отм*» в строке поиска и затем кликните кнопку «Найти далее». Наше регулярное выражение означает любое количество букв (* звёздочка), следующих после «отм».
В качестве альтернативы ввода символа звёздочки с клавиатуры, вы можете использовать выбор специального символа из списка подстановочных знаком. Вначале наберите «отм» в строке «Найти». Поставьте галочку «Подстановочные знаки». Затем кликните кнопку «Специальный» и выберите «Любое число символов». После этого нажмите кнопку «Найти далее»:
Word оценивает поиск и показывает вам первое вхождение, которое он найдёт в документе. Продолжайте кликать «Найти далее», чтобы найти все части текста, которые соответствуют вашему поисковому термину.
Вы должны помнить важную вещь: при включении подстановочных знаков, поиск автоматически становится чувствительным к регистру (такова особенность регулярных выражений, частью которых являются подстановочные символы). Поэтому поиск «отм*» и «Отм*» даст различные результаты.
Использование знака вопроса для поиска определённого количества символов
В то время как звёздочка означает любое количество символов, знак вопроса в регулярном выражении означает единичный (один) символ. Например, если «отм*» будет искать строки начинающиеся с «отм» за которыми идёт любое количество символов, то «отм?» будет искать строки, начинающиеся с «отм», за которой идёт только один символ.
Как и звёздочку, знак вопроса можно использовать в любой части слова — в том числе в начале и в середине.
Также можно использовать вместе несколько знаков вопроса вместе, тогда они будут обозначать несколько букв.
Например, регулярное выражение для поиска «о?о?о» оно означает букву «о», за которой идёт любой символ, затем снова идёт буква «о», затем опять любой символ и затем опять буква «о» найдёт следующие слова:
- потоков
- многополосных
- многополосных
- которое
- правового
- такового
- такого основания
Можно найти слова с четырьмя буквами «о», шаблон «о?о?о?о»:
- которого
- многополосных
Или с тремя буквами «а», шаблон «а?а?а»:
- наказания
- задача
- аппарата
- высказана
- началах
Необязательно использовать одинаковые буквы — составляйте выражения под ваши задачи.
Например, чтобы найти слова, в которых первая буква «з», затем идёт любой другой символ, а затем буква «к» и вновь любой символ, шаблон для поиска «з?к?» найдёт:
- закономерности
- законодательно
Использование знака собачка (@) и фигурных скобок ({ and}) для поиска вхождений предыдущего символа
Вы можете использовать знак собачка (@) для указания одного или более вхождения предыдущего символа. Например, «ro@t» найдёт все слова, которые начинаются на «ro» и заканчиваются на «t» и которые имеют любое количество букв «o» между этими частями. Поэтому по этим условиям поиска будут найдены слова «rot», «root» и даже «roooooot».
Для большего контроля поиска предыдущих символов, вы можете использовать фигурные скобки, внутри которые укажите точное число вхождений предыдущего символа, который вы хотите найти. Например, поиск «ro{2}t» найдёт «root», но не найдёт «rot» или «roooooot».
Также поддерживает синтаксис вида {n;} — означает искать количество вхождений символа более n раз; {;m} — означает искать количество вхождений символа менее m раз; {n;m} — означает искать количество вхождений символа более n раз, но менее m раз.
Чтобы показать более практический пример, немного забежим вперёд, следующий поиск использует набор символов (будут рассмотрены в этой статье чуть ниже), в результате, будут найдены все слова, в которых подряд идут четыре согласных буквы:
[бвгджзйклмнпрстфхцчшщ]{4}
Использование угловых скобок (< и >) для обозначения начала и конца слова
Думаю, вы заметили, особенно когда составляли поисковые запросы со звёздочкой, что пробел считается за обычный символ и могут быть найдены довольно неожиданные фрагменты большого размера, либо фрагменты, состоящие из двух слов. Вы можете использовать угловые скобки (символы «больше чем» и «меньше чем») для обозначения начала и конца слова поиска. Например, вы можете искать «<но>» и Word найдёт все вхождения «но», но не найдёт слова вроде «новости», «законодатель».
Это довольно полезно, но эта техника становится более мощной, когда вы комбинируете её с другими подстановочными символами. Например, с помощью «<з????>» вы можете найти все слова, которые начинаются на «з» и состоят ровно из пяти букв.
Вам необязательно использовать обе угловые скобки в паре. Вы можете обозначить просто только начало или конец слова, используя только одну соответствующую скобку. Например «ство>» найдёт слова
- руководство
- множество
- средство
- количество
Использование квадратных скобок ([ и ]) для поиска определённых символов или диапазонов символов
Вы можете использовать квадратные скобки для указания любых символов или диапазонов символов. Например «[а]» будет искать любые вхождения буквы «а».
В следующем примере, будет искаться строка, которая начинается на «р», затем идёт любая гласная, а затем снова буква «р»: «р[аеиоуэюя]р»
Далее аналогичный пример, но между буквами «р» должно быть две любых гласных: «р[аеиоуэюя]{2}р», будет найдено, к примеру, слово «приоритет».
Вы также можете искать квадратные скобки для поиска диапазонов символов, например «[a-z]» найдёт любую из этих букв в нижнем регистре. Поиск «[0-9]» найдёт любую из этих цифр.
Пример р[а-и]{2}р найдёт строку, которая начинается и заканчивается на букву «р» между которыми две любые буквы из указанного диапазона.
Следующий пример довольно сложный, но при этом и довольно интересный:
[А-Я]{1}[а-я0-9 ,-]{1;}.
В начале строки должна стоят любая заглавная буква ([А-Я]) ровно один раз ({1}). Затем должны идти маленькие буквы, цифры, пробелы, запятые и тире ([а-я0-9 ,-]) хотя бы один раз и более ({1;}), в самом конце должна стоять точка (.)
Думаю вы догадались, что это регулярное выражение которое будет искать предложения. Перечислены не все возможные символы, поэтому не будут найдены предложения, содержащие кавычки и некоторые другие символы, а также вопросительные и восклицательные предложения.
То есть вы можете комбинировать подстановочные символы и дополнять их кванторами количества, а затем это всё комбинировать любое количество раз, пока не получите желаемый результат. На самом деле, это довольно сложно — почти как программирование, поскольку требует абстрактного мышления.
Использование скобок для группировки поисковых терминов в последовательности
Вы можете использовать круглые скобки в вашем поиске для группировки последовательностей символов.
Можно использовать довольно простые шаблоны, например «(го){3;}» найдёт строки, в которых «го» встречается три и более раза подряд.
Но настоящую силу эта конструкция покажет при использовании в операциях поиска и замены.
Показанная далее техника называется «обратные ссылки». Начнём с конкретного примера, чтобы было проще понять. Предположим, нам нужно во всём документе поменять местами два слова, допустим, имя и фамилию. К примеру, во всём тексте множество раз упоминается «Милосердов Алексей», а нам нужно, чтобы было «Алексей Милосердов».
Для этого в строке поиска мы вставляем «(Милосердов) (Алексей)», а в строке «Заменить на» пишем «2 1».
Скобки не участвуют в поиске, то есть в результате будет искаться фраза «Милосердов Алексей» При этом то, что было найдено в первых скобках, будет присвоено как значение «1», а то, что было найдено во вторых скобках, станет значением «2». При этом найденная строка заменится на «Алексей Милосердов».
Можно сделать по-другому, допустим вместо фамилии и имени, я хочу заменить на фамилию и инициалы, тогда в строке поиска я ищу «(Милосердов) (Алексей)», а в строке «Заменить на» пишу «1 А.В.».
В скобках можно писать не только слова, там могут использоваться подстановочные символы в разных сочетаниях, а также кванторы количества. Когда находится целая фраза, то Word автоматически пронумеровывает эти группы слева направо (это происходит «под капотом» — мы это не видим), поэтому в поле «Заменить на» мы можем использовать эти группы по их номеру, перед которым нужно поставить обратный слэш.
Рассмотрим более жизненный пример. Допустим, у нас по всему документу имеются даты вида 31.12.2019 (то есть в формате день.месяц.год), а мы хотим чтобы все эти даты были в формате 2019.12.31 (то есть год.месяц.день).
Тогда для поиска любых дат составляем регулярное выражение с подстановочными символами:
«[0-9]{2}.[0-9]{2}.[0-9]{4}»
«[0-9]» — это диапазон, обозначающий все цифры, «{2}» — это квантор количества, который говорит, что предыдущий символ должен встречаться ровно два раза. То есть будет искаться строка длиной ровно два символа, состоящая из цифр. Затем идёт точка, затем снова аналогичная строка и точка, и в конце строка из четырёх цифр.
Строка подходит для поиска, но чтобы были созданы обратные ссылки, мы заключаем нужные нам элементы в круглые скобки: «([0-9]{2}).([0-9]{2}).([0-9]{4})» — она будет работать точно также, как и предыдущая.
Теперь составляем строку «Заменить на». В начале идёт год, то есть третья группа, она обозначается как «3», затем точка, затем вторая группа, затем опять точка и затем первая группа, получаем «3.2.1».
Используйте обратный слэш () если вам нужно искать символы, которые являются подстановочными знаками
А что если вам нужно найти в документе символ, который используется как подстановочный? Например, если вам нужно найти звёздочку? Если просто её вставите, то она сработает как подстановочный знак и будет найдено всё что угодно. Есть два способа искать символы в их буквальном значении.
Первый способ, это снять галочку с опции «Подстановочные знаки» перед выполнением поиска. Но если вы не хотите это делать, вы можете использовать обратный слэш () перед этим символом. Например, чтобы найти буквальный знак вопроса при включённых «Подстановочных знаках», введите в поле Поиск «?».
Заключение
Вы можете делать весьма сложные поиски и замены комбинируя подстановочные символы в ваших поисках в Word, поэтому продолжайте пробовать с ними. После того, как вы действительно разберётесь, какой потенциал несут регулярные выражения, вы сможете увеличить вашу продуктивность. Нам только следует порекомендовать вам не делать большие операции поиска и замены одновременно для всего документа, если у вас нет полной уверенности что ваши подстановочные символы делают именно то, что вы задумали. Также рекомендуется для этого использовать тестовые копии документов.
Связанные статьи:
- Как в Microsoft Word сделать массовую замену или удаление текста (74%)
- Как убрать лишние пробелы в Microsoft Word (74%)
- Как выделить текст цветом в Word (66.3%)
- Как вставить музыкальный символ, ноты в Word (57.7%)
- Как напечатать диапазон страниц документа Word из нескольких разделов (57.7%)
- Как заблокировать текстовые поля в Word (RANDOM — 50%)
Word: специальные символы и подстановочные знаки
В окне «Найти и заменить» Microsoft Word есть два типа подстановок — специальные символы и подстановочные знаки.
Те и другие можно вводить в строки поиска и замены, включив используя список «Special» («Специальный») в полностью открытом окне «Найти и заменить» (нажать комбинацию клавиш Ctrl+H
, потом кнопку «Больше>>
«).
Специальные символы — это те, которых нет на клавиатуре или которые нельзя непосредственно вписать в строки поиска/замены,
например, разрыв строки.
Если в окне поиска/замены включен чекбокс Use wildcards (Подстановочные знаки), то можно задавать достаточно сложные условия поиска и замены, потому что подстановчные знаки — это офисная реализация всё тех же регулярных выражений.
Чекбокс «Подстановочные знаки» в работе — убираем лишние пробелы в тексте
Некоторые символы и знаки можно использовать только в строке поиска, а некоторые — только в строке замены.
При этом возможность применения
части символов зависит от того, включен ли чекбокс Use wildcards (Подстановочные знаки).
Полный список подстановок в самом Word отсутствует или я его не нашёл, поэтому ниже приводится более-менее адекватный список, актуальный для всех версий Word плюс немного примеров.
1. Строка поиска
Спец. символы | Обозначение (англ.) | Обозначение (рус.) |
^p | Paragraph mark (¶) | Конец абзаца (¶) |
^? | Any character | Любой символ |
^# | Any digit | Любая цифра |
^$ | Any letter | Любая буква |
^e | Endnote mark | Концевая сноска |
^d | Field | Поле |
^f | Footnote mark | Нижняя сноска |
^b | Section break (===End of section===) | Разрыв секции |
^w | Whitespace | Любое количество и комбинация обыкновенных и неразрываемых пробелов, табуляций и концов абзаца |
Спец. символы | Обозначение (англ.) | Обозначение (рус.) |
^t | Tab character | Символ табуляции |
^a | Comment mark | Комментарий |
^0nnn | ANSI or ASCII characters | Любой ANSI или ASCII символ с кодом nnn |
^^ | Caret character | Символ ^ |
^g | Graphic | Графика |
^n | Column break (···Column Break···) | Разрыв колонки |
^l | Manual line break | Принудительный разрыв строки |
^m | Manual page break (—Page Break—) | Принудительный разрыв страницы (—Page Break—). Если опция Use wildcards включена, то ищет принудительный разрыв и страницы, и секции |
^+ | Em dash (—) | Длинное тире (—). Символ с кодом 0151 |
^= | En dash (–) | Короткое тире (–). Символ с кодом 0150 |
^s | Nonbreaking space (°) | Неразрывный пробел (°) |
^~ | Nonbreaking hypen (-) | Неразрывный дефис (-) |
^- | Optional hypen (¬) | Мягкий перенос (¬) |
Подстановочные знаки | Обозначение (рус.) | Пример строки поиска | Примеры результатов поиска (в кавычках) |
? | Один любой символ | б?к | «бак», «бок», «бук», «б5к», «б¶к» |
* | Любое количество любых символов | б*к | «бык», «бардак», «белый¶ полковник» |
[] | Один из указанных символов | б[аоу]к | «бак», «бок», «бук» |
[-] | Один символ из диапазона. Диапазон должен быть указан в порядке возрастания кодов символов. |
[а-яё] | Любая строчная русская буква |
[А-ЯЁ] | Любая прописная русская буква | ||
[0-9] | Любая цифра | ||
[!] | Один любой символ, не указанный после восклицательного знака | б[!ы]к | «бак», «бок», но не «бык» |
[!x-z] | Один любой символ, не входящий в диапазон, указанный после восклицательного знака | [!а-яё]ок | «Бок», «Док», но не «бок», «док» |
[!0-9] | Любой символ, кроме цифр | ||
{n} | Строго n вхождений предыдущего символа или выражения. Выражением является все то, что заключено в круглые скобки. Выражение может состоять как из конкретных символов, так и содержать спец. символы. |
10{3} | «1000», но не «100», «10000» |
10(20){2} | «102020», но не «1020», «10202020» | ||
{n;} | n и более вхождений предыдущего символа или выражения | 10{3;} | «1000», «10000», «100000», но не «100» |
{n;m} | От n до m включительно вхождений предыдущего символа или выражения | 10{3;4} | «1000», «10000», но не «100», «100000» |
@ | Ноль или более вхождений предыдущего символа или выражения | 10@ | «10», «100», «1000», «10000» |
< | Начало слова | <бок | «боксёр», но не «колобок» |
> | Конец слова | бок> | «колобок», но не «боксёр» |
2. Строка замены
Спец. символы | Обозначение (англ.) | Обозначение (рус.) |
^p | Paragraph mark (¶) | Разрыв абзаца (¶) |
^t | Tab character | Символ табуляции |
^0nnn | ANSI or ASCII characters | Любой ANSI или ASCII символ с кодом nnn |
^^ | Caret character | Символ ^ |
^c | Clipboard contents | Содержимое буфера обмена |
^& | Contents of the Find what box | Содержимое строки поиска (или то, что найдено) |
^n | Column break (···Column Break···) |
Разрыв колонки |
^l | Manual line break (¿) | Принудительный разрыв строки |
^m | Manual page break (—Page Break—) | Принудительный разрыв страницы |
^+ | Em dash (-) | Длинное тире (-). Символ с кодом 0151 |
^= | En dash (–) | Короткое тире (–). Символ с кодом 0150 |
^s | Nonbreaking space (°) | Неразрывный пробел (°) |
^~ | Nonbreaking hypen (-) | Неразрывный дефис (-) |
^- | Optional hypen (¬) | Мягкий перенос (¬) |
Спец. символы | Обозначение (англ.) | Обозначение (рус.) |
n | Expression n | Выражение номер n из строки поиска |
Примечание 1. В операторах {n;} и {n;m} точка с запятой означает List separator (Разделитель элементов списка) из настроек операционной системы, зависящих от локали
(например, в США — запятая, в России — точка с запятой).
Примечание 2. Для поиска в документе символов, которые в строке поиска «заняты» как специальные перед ними ставится обратный слэш ().
Например, если включена опция Use wildcards (Подстановочные знаки), для поиска восклицательного знака в строке поиска вводится !
3. Примеры для поиска
Строка поиска | Что ищет |
[!^0013]^0013[!^0013] | Конец абзаца в окружении двух других символов |
^0032{2;} | Два и более пробелов |
[.,:;!?] | Знак препинания |
<[0-9]@,[0-9]@> | Вещественное число, набранное через запятую |
<[А-яЁё]@> | Русское слово (зависит от кодировки) |
4. Примеры для замены
Подстановочные знаки включены!
Строка поиска | Строка замены | Что заменяет |
(^0013){2;} | 1 | Удаление пустых строк (если они создавались нажатием Enter) |
^0032([.,:;!?]) | 1 | Удаление пробелов перед знаками препинания |
([0-9])^0032([0-9]) | 1^s2 | Замена пробелов между цифрами на неразрывные пробелы |
-([0-9]) | ^01501 | Замена дефисов перед цифрами на правильный символ «минус» |
Ивано([а-я]@>) | Петро1 | Замена Ивановых на Петровых во всех падежах сразу (конечно, фамилии должны склоняться одинаково) |
(<[0-9]@).([0-9]@>) | 1,2 | Замена десятичных точек между цифрами на запятые |
24.09.2020, 10:16 [28919 просмотров]
Невозможно использовать встроенный Find Word для определения конца строки, созданной автоматическим макетом Word. Единственный вид «конца строки», который можно найти, — это перенос строки вручную, вставляемый нажатием Shift + Enter. Ручной разрыв строки соответствует специальному символу поиска ^l.
Если вам нужно найти и продолжить до конца строки, вам нужно использовать макрос (VBA). Следующий пример кода делает то, что вам нужно. Обратите внимание, что с кодом как он есть по завершении макроса будет выбрано только последнее вхождение поискового запроса. Вам нужно встроить в него конечный результат, который вы ищете.
Или просто удалите строки Do While и Loop, и макрос найдет первый член.
Sub FindThenToEndOfLine()
Dim r As Range, rDoc As Word.Range
Dim bFound As Boolean
bFound = True
Set r = ActiveDocument.content
Set rDoc = r.Duplicate
r.Find.ClearFormatting
Do While bFound
With r.Find
.text = "Fedora[0-9][0-9]:[a-z]*[A-Z]*"
.Forward = True
.wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
bFound = .Execute
End With
If bFound Then
r.Select
Selection.EndKey Unit:=wdLine, Extend:=True
End If
Loop
End Sub
#regex #vba #ms-word #newline #wildcard
Вопрос:
Я пытаюсь использовать регулярные выражения, чтобы найти определенную подстроку и все, что после нее, до следующей строки. Например:
These are numbers: one, two, three
These are colors: yellow, blue, green
Я хочу найти строку «числа: один, два, три», и я использовал следующий шаблон:
Public Sub TEST()
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True
For Each Match In findRegEx(ActiveDocument.Range, "numbers: .*")
Debug.Print Match.Value
Next
End Sub
Все объяснения метасимвола «подстановочный знак», которые я нашел, наводят меня на мысль, что он будет находить все символы, кроме символов новой строки, но этот шаблон также возвращает вторую строку вместо только первой. Я не уверен, правильно ли я понимаю природу подстановочного знака или новых строк в Word.
Комментарии:
1. Пожалуйста, укажите код, который вы используете для запуска этого регулярного выражения, а не только само регулярное выражение.
2. может быть, использовать
numbers: .*r
для вашего регулярного выражения?3. Я попробовал
r
, но и это не сработало.4. Является ли конец строки на самом деле возвратом каретки или чем-то еще?
5. Вот в чем вопрос, я не знаю, что именно обозначает конец строки. Я пробовал
r
,n
,vbCr
,vbNewline
, иChr(13)
, и ни один из них не дал желаемого результата.
Ответ №1:
Попросите регулярное выражение не совпадать с символом конца строки.
Поэтому замените "numbers: .*"
, "numbers: [^n]*"
что можно прочитать как «сопоставьте строки, начинающиеся с»чисел:», и любой символ, не являющийся символом конца строки».
Если в вашей строке используются другие символы конца строки , вам придется настроить n на один или комбинацию , возможно, в обычном случае n r.
Не пытайтесь использовать vbCr
vbNewLine
или Chr(13)
как часть определения шаблона — это литералы. Синтаксис регулярных выражений ожидает, что эти значения будут обозначаться специальными символами.
Обратите внимание, что после двоеточия»: «стоит пробел.
Комментарии:
1. Это сработало! Почти. единственный символ конца строки, который я могу заставить работать,-это Chr(13):
"numbers: [^] amp; Chr(13) amp; "]*"
Это работает так, как задумано. Спасибо!2. Спасибо, Доминик — я исправлю ответ, как только проверю некоторые детали.