Страницы: 1
RSS
RegExp. Шаблон "\b[A-ZА-ЯЁ][a-zа-яё]+\b" работает с латинским текстом, а на кириллицу не действует.
 
Добрый день.
Имеется шаблон, чтобы вытащить слова, у которых 1-я буква прописная, а остальные строчные.
Так, код:
Код
Sub пример()
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\b[A-ZА-ЯЁ][a-zа-яё]+\b"
objRegExp.Global = True
    Set objMatches = objRegExp.Execute(ActiveCell.Value)
    For i = 0 To objMatches.Count - 1
        ActiveCell.Offset(, i + 1).Value = objMatches.Item(i).Value
    Next
End Sub
действует на текст: "Perviy 1-y Vtoroy 2-y" (вытаскивает "Perviy" и "Vtoroy")
но не действует на текст: "Первый 1-й Второй 2-й" (ничего не вытаскивает)

Проверил корректно ли написаны в шаблоне буквы а и А (и латинскими и кириллицей) --> не помогло.

В чём причина?

Или \b признаёт только латинский текст?
Изменено: Бахтиёр - 05.10.2021 16:00:17
 
В теме https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=119086&TITLE_SEO=119086-kak-iz-teksta-pri-poluchenii-russkogo-slova-isklyuchit-slova-soderzhashch&logout_butt=%D0%92%D1%8B%D0%B9%D1%82%D0%B8
ZVI предлагал трюк для работы с \b с русскими буквами, но я так и не осилил. Может вам удастся. Удачи
 
Да, причина в /b насколько я понял.
Kuzmich, спасибо, посмотрю.
Изменено: Бахтиёр - 05.10.2021 16:04:05
 
пока решил так:
Код
objRegExp.Pattern = "(^|\s)[A-ZА-ЯЁ][a-zа-яё]+"
а как в шаблоне оставить \s для проверки начала слова, но чтобы этот самый пробел не попал в результат?
Изменено: Бахтиёр - 05.10.2021 16:32:53
 
"(^|\s)[(A-ZА-ЯЁ][a-zа-яё]+)"
и возьмите потом
objMatches.Item(i).submatches(1)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,  спасибо.
 
(?!:^|\s)([A-ZА-ЯЁ]\S+)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Бахтиёр, здравствуйте
Без регулярок, но за 3,8 на 1 млн строк. ReDim Preserve - слабое звено
Изменено: Jack Famous - 07.10.2021 13:23:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: ReDim Preserve - слабое звено
А оно там зачем? Передавать  в функцию  v  и n. А выгружать:
Код
[a1].Resize(1, n).Value = arr

И spl передавать, зачем каждый раз переопределять размер?
Изменено: vikttur - 07.10.2021 13:35:58
 
vikttur, ну я обычно так и делаю, но тут ведь пример всё-таки, а там дополнительная переменная  :D
Добавлю вариант  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: тут ведь пример
Не понял - в примере не надо переменную добавлять? Да и не добавляется она, а существует практически все время, возрождаясь, как птица феникс )
Изменено: vikttur - 07.10.2021 13:39:41
 
А редимить не так уж и плохо
можно ещё ускорить, но придётся передавать в функцию массив для заполнения и переменную счётчика или, того хуже, делать глобальные переменные уровня модуля
Ни хрена я заметно не выиграл)))
Изменено: Jack Famous - 07.10.2021 14:28:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, JayBhagavan,  спасибо.

Jack Famous,
Скрытый текст
Изменено: Бахтиёр - 07.10.2021 17:53:55
Страницы: 1
Наверх