Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
3 / 3 / 0
Регистрация: 22.08.2015
Сообщений: 125

RegEx найти единицы измерения в конце формулы не отделенные пробелом

18.01.2018, 10:51. Показов 1231. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ряд формул в формате Equation.
нужно заменить разделитель дробной части на запятую (с этим справился - код ниже)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub заменить_точки_на_запятые()
 
Set oDoc = ActiveDocument
 
Set oRng = oDoc.Application.Selection.Range
 
For Each M In oRng.OMaths
'Debug.Print M.Range.text
 
'меняем точку на запятую
               With M.Range.Find
                    .ClearFormatting
                    .Replacement.ClearFormatting
                    .Forward = True
                    .text = "([0-9]).([0-9])"
                    .Replacement.text = "\1,\2"
                    .Wrap = wdFindContinue
                    .MatchWildcards = True
                    .Execute replace:=2
                End With
                
Next
 
End Sub
А еще нужно найти единицы измерения в конце формулы и отделить пробелом
т.е сделать 0,1 % вместо 0,1% и т.д.
Как это сделать ? ^ в качестве символа конца строки тут не похоже чтоб работал
Может поиск можно сделать однократным и с конца ? тоже не совсем выход -ед.измерения ведь может в формуле и не быть.
Миниатюры
RegEx найти единицы измерения в конце формулы не отделенные пробелом  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2018, 10:51
Ответы с готовыми решениями:

Значение имеет единицы измерения Unitless, а должно иметь единицы измерения длина
Странно, что проблема с единицами измерения, хотя имею дело с матрицами и числами без единиц измерения del]

Дан текст, слова в нем разделяются пробелом, в конце стоит точка. Найти количество слов в тексте
4. Дан текст, слова в нем разделяются пробелом, в конце стоит точка. Найти количество слов в тексте и вывести каждое слово, стоящее на...

Regex с пробелом
Доброго времени суток. Нужно регулярным выражением вытянуть некую подстроку, точнее слово, что находится между пробелами. В строке всего 2...

11
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
18.01.2018, 11:16
Цитата Сообщение от diplom-electro Посмотреть сообщение
в конце формулы
Значит это знак =, потом число. И после числа надо вставить пробел.
Вообще, можно вручную сделать - Вы же не монографию редактируете
Или в полуавтоматическом режиме - задать поиск [0-9,]{1;} , замена ^& (пробел в конце!), Найти далее - и в зависимости от положения найденного нажимать либо Заменить, либо Найти далее.
Если все же хотите полный автомат - приложите документ с содержимым картинки.
0
3 / 3 / 0
Регистрация: 22.08.2015
Сообщений: 125
18.01.2018, 14:24  [ТС]
Цитата Сообщение от Казанский Посмотреть сообщение
Значит это знак =, потом число. И после числа надо вставить пробел.
Вообще, можно вручную сделать - Вы же не монографию редактируете
знаков равно в формуле больше одного как правило.
вручную слишком долго (работ больше одной, страниц сотни) и главное это работа "дурная", я такую автоматизирую в любом случае (даже если это дольше чем руками - но не так скучно )
можно конечно все используемые основные ед. измерения забить... будет не больше пары десятков, но это же "некрасиво".

файл пример прикладываю
все что мне в принципе осталось понять - это как в Wordе в Regex записать конец строки/выражения.
0
35 / 32 / 15
Регистрация: 23.12.2014
Сообщений: 97
18.01.2018, 15:22
... а если поиском с конца проверять символы до "первого" (первого с конца) цифрового символа и в этом месте по индексу поиска вставлять пробел ? Правда, в середине строки ед.измерения так не распознать...
0
3 / 3 / 0
Регистрация: 22.08.2015
Сообщений: 125
18.01.2018, 16:50  [ТС]
а как это выполнить на VBA ?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
18.01.2018, 19:10
diplom-electro, 2 замены без VBA
1. ([0-9])([!0-9])> на \1 \2 , подстановочные знаки
2. ([0-9])(%.) замена та же
0
3 / 3 / 0
Регистрация: 22.08.2015
Сообщений: 125
18.01.2018, 20:38  [ТС]
не могу я понять вашу идею признаюсь...
0
35 / 32 / 15
Регистрация: 23.12.2014
Сообщений: 97
19.01.2018, 08:11
Цитата Сообщение от diplom-electro Посмотреть сообщение
не могу я понять вашу идею...
Здесь не идея, а Казанский прямым текстом пишет, что Ваш код нужно скопировать между With и End With и вставить за ним еще две таких копии, но в них изменить текст поиска и на что менять искомое, соответственно из пунктов 1. и 2. ...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
'...
With M.Range.Find   'Ваш код
    .ClearFormatting
    .Replacement.ClearFormatting
    .Forward = True
    .text = "([0-9]).([0-9])"
    .Replacement.text = "\1,\2"
    .Wrap = wdFindContinue
    .MatchWildcards = True
    .Execute replace:=2
End With                'Ваш код
 
With M.Range.Find       'копия Вашего кода
    '...
    .text = "([0-9]).([!0-9])>"
        'этот шаблон означает - искать место между цифровым [0-9] и нецифровым [!0-9] символами
        'с конца > строки. (...) означают - найденное сгруппировать. Т.к. две пары скобок, то
        'исходная строка соответственно попадет в две группы, по обе стороны от искомого места...
    .Replacement.text = "\1 \2"     'между \1 \2 должен быть пробел
        'что означает - нужно при замене вставить найденные группы \1 и \2, но между ними
        'вставить что-то, в данном случае пробел...
    '...
End With                'копия Вашего кода
 
With M.Range.Find       'еще копия Вашего кода
    '...
    .text = "([0-9])(%.)"
    .Replacement.text = "\1 \2" 'между \1 \2 - пробел
    '...
End With                'еще копия Вашего кода
'...
to Казанский:
А есть источник, кроме встроенного help, где можно посмотреть подробности по поводу wildcards, потому что Ваше первое условие выглядело в моей версии как ([0-9])([!0-9]>) (в Word97) и не очень понятно, почему % не попал под это условие... Или это "встроенный" опыт?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
19.01.2018, 09:16
AlexSmel, мне тоже непонятно, почему Word не считает % не-цифрой. Поэтому и потребовалась вторая замена.
Из источников что-то конкретно назвать не могу, гугление по конкретной проблеме чаще всего приводит на wordexpert.ru и stackoverflow.com. Из свежего: Расширенный поиск с использованием "подстановочных знаков"

diplom-electro, я имел в виду проделать две указанные замены через диалог Ctrl+H без использования VBA. В файле-примере они приводят к требуемому результату. Если ваша цель - отредактировать документ, то это решение. Если цель - придумать шаблон для поиска, чтобы получить результат одной заменой и написать "красивую" программу, то я пас.
0
3 / 3 / 0
Регистрация: 22.08.2015
Сообщений: 125
19.01.2018, 10:44  [ТС]
я имел в виду проделать две указанные замены через диалог Ctrl+H без использования VBA.
цель написать рабочий код а все что делается через диалог можно и в макросе без проблем повторить.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Set oDoc = ActiveDocument
 
Set oRng = oDoc.Application.Selection.Range
 
For Each M In oRng.OMaths
'M.Linearize
Debug.Print M.Range.text
 
'меняем точку на запятую
               With M.Range.Find
                    .ClearFormatting
                    .Replacement.ClearFormatting
                    .Forward = True
                    .text = "([0-9]).([0-9])"
                    .Replacement.text = "\1,\2"
                    .Wrap = wdFindContinue
                    .MatchWildcards = True
                    .Execute replace:=2
 
 'этот шаблон означает - искать место между цифровым [0-9] и нецифровым [!0-9] символами
                    .text = "([0-9]).([!0-9])>"
                    .Replacement.text = "\1 \2"
                    .Execute replace:=2
                    
                    .text = "([0-9])(%.)"
                    .Replacement.text = "\1 \2" 'между \1 \2 - пробел
                    .Execute replace:=2
                    
            End With
                    
 
    '\=([0-9\(\)\.,]*)
Next
 
'For Each M In oRng.OMaths
'M.BuildUp
'Next
Неплохая в общем то идея "([0-9])([!0-9])> на \1 \2 , подстановочные знаки"
но не обрабатываются единицы измерения вида мм2 и т.д.
0
35 / 32 / 15
Регистрация: 23.12.2014
Сообщений: 97
19.01.2018, 14:06
Цитата Сообщение от diplom-electro Посмотреть сообщение
не обрабатываются единицы измерения вида мм2
...а у меня - обрабатываются. Что я делаю не так?...
Миниатюры
RegEx найти единицы измерения в конце формулы не отделенные пробелом   RegEx найти единицы измерения в конце формулы не отделенные пробелом   RegEx найти единицы измерения в конце формулы не отделенные пробелом  

0
35 / 32 / 15
Регистрация: 23.12.2014
Сообщений: 97
19.01.2018, 15:50
Ну хорошо, ответ на вопрос, что я делаю не так - на картинке...

"...В VBA-Word можно вести поиск с использованием "Selection" и с использованием "Range". Поиск с использованием "Selection" связан с окном "Найти и заменить", которое есть в программе "Word". Поэтому, прежде чем вести поиск с использованием "Selection", нужно подготовить объект "Find" - нужно убрать настройки от предыдущего поиска, например:
Visual Basic
1
Selection.Find.ClearFormatting
При использовании поиска с "Range" очистку от предыдущих параметров поиска делать не надо, а можно сразу указывать нужные параметры. Это связано с тем, что при каждом поиске с использованием "Range" в оперативной памяти компьютера создаётся новый экземпляр объекта "Find", который имеет значения по умолчанию..."
© Скрипт

Ну и, так как Вы все равно используете замену по всему выделению ( .Execute replace:=2), то особого смысла в переборе объектов OMath нет, у Selection, тоже есть .Range а у него - свойство .Find, и если в дальнейшем ссылки, устанавливаемые командой Set не будут использоваться, то вот тоже
Цитата Сообщение от diplom-electro Посмотреть сообщение
рабочий код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
With Selection.Range.Find
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWildcards = True
        .Text = "([0-9]).([0-9])"
        .Replacement.Text = "\1,\2"
        .Execute Replace:=2
        .Text = "([0-9])([!0-9])>"
        .Replacement.Text = "\1 \2"
        .Execute Replace:=2
        .Text = "([0-9])(%.)"
        .Replacement.Text = "\1 \2"
        .Execute Replace:=2
End With
Миниатюры
RegEx найти единицы измерения в конце формулы не отделенные пробелом  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.01.2018, 15:50
Помогаю со студенческими работами здесь

Единицы измерения
Мне нужно что результат считало в кило-ваттах, а считает в ваттах. Что делать? И как задать верхний текстовый индекс? (п штрих) P'

единицы измерения
Дана величина А, выражающая объем информации в байтах. Перевести А в более крупные единицы измерения информации. Добавлено через 1...

Единицы измерения
Не подскажете в функции elem.setLayoutParams(new LinearLayout.LayoutParams(100, 40)); значения 100 и 40 это в px или dp? В каких единицах?...

Единицы измерения
Доброго времени суток, уважаемые форумчане. Подскажите, как можно просто показать единицы измерения в документе без задействования их в...

Единицы измерения
Обязательно ли сейчас пользоваться em, rem или можно просто px а потом просто сделать адаптацию? Если обязательно, то в каких случаях их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru