v__step, хорошо, чтобы не было неясностей, приведи полный пример) Мож я просто не проснусь не как)
Ну если ты не об этом, тогда я не знаю, о чем)
[vba]
Code
Sub io() Dim x As String x = "123456789" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?=(\d{3})+(\D|$))" x = .Replace(x, " ") End With MsgBox """" & x & """" End Sub
[/vba]
v__step, хорошо, чтобы не было неясностей, приведи полный пример) Мож я просто не проснусь не как)
Ну если ты не об этом, тогда я не знаю, о чем)
[vba]
Code
Sub io() Dim x As String x = "123456789" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?=(\d{3})+(\D|$))" x = .Replace(x, " ") End With MsgBox """" & x & """" End Sub
Sub io() Dim x As String x = "1234567890" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?=(\d\d\d)+(?!\d))" x = .Replace(x, " ") End With End Sub
[/vba] [vba]
Код
Sub io() Dim x As String x = "1234567890" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?=(\d{3})+(\D|$))" x = .Replace(x, " ") End With End Sub
[/vba]
[vba]
Код
Sub io() Dim x As String x = "1234567890" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?=(\d\d\d)+(?!\d))" x = .Replace(x, " ") End With End Sub
[/vba] [vba]
Код
Sub io() Dim x As String x = "1234567890" ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(?=(\d{3})+(\D|$))" x = .Replace(x, " ") End With End Sub
Это удивительно, но я копирую код прямо из редактора VBA, у меня оба примера работают "на ура" А твой текст после вставки добавляет пробел (но шаблоны совпадают - ерунда какая-то)
Только что десятый раз все перепроверил Перенес шаблон из своего кода в твой, изменил позднее связывание на раннее - ничего не помогает Твоя процедура после вставки добавляет пробел (но шаблоны совпадают - ерунда какая-то), а мои - нет
Я сейчас работаю в Wn98-XL2000 - возможно, в этом объяснение... Пора идти домой - попробую в другой среде...
Это удивительно, но я копирую код прямо из редактора VBA, у меня оба примера работают "на ура" А твой текст после вставки добавляет пробел (но шаблоны совпадают - ерунда какая-то)
Только что десятый раз все перепроверил Перенес шаблон из своего кода в твой, изменил позднее связывание на раннее - ничего не помогает Твоя процедура после вставки добавляет пробел (но шаблоны совпадают - ерунда какая-то), а мои - нет
Я сейчас работаю в Wn98-XL2000 - возможно, в этом объяснение... Пора идти домой - попробую в другой среде...v__step
вот строка --> x = "123456789" ' string. Один (любой) символ из строки в своих примерах убери)))
Попробовал и не один. Работает, зараза! Ура! Поймал! Начал методично убирать по символу - получилось, но не сразу Так и чистый Фридловский шаблон дал тот же сбой А твой с (?!^) выдал лишние пробелы перед цифрами, если перед ними шел текст
Quote (nerv)
вот строка --> x = "123456789" ' string. Один (любой) символ из строки в своих примерах убери)))
Попробовал и не один. Работает, зараза! Ура! Поймал! Начал методично убирать по символу - получилось, но не сразу Так и чистый Фридловский шаблон дал тот же сбой А твой с (?!^) выдал лишние пробелы перед цифрами, если перед ними шел текстv__step
С уважением, Владимир
Сообщение отредактировал v__step - Понедельник, 09.01.2012, 21:31
Володь, для строки можно попробовать вот такой шаблон (см. ниже) Код на js, но думаю, ты разберешься. Не могу я на vba шаблонами мыслить) Для вещественных чисел он не подходит. Проверь его на всех трех строках и отпишись. По идее должно работать, хоть и писал на скорую руку
//var x = "123456789"; //var x = "1234567890"; var x = "не вернет 3333-и барана или не вернет 3333 барана"; var z = /(?!\b)(?=(?:\d{3})+(?=\b))/g var w = x.replace(z, " ");
Володь, для строки можно попробовать вот такой шаблон (см. ниже) Код на js, но думаю, ты разберешься. Не могу я на vba шаблонами мыслить) Для вещественных чисел он не подходит. Проверь его на всех трех строках и отпишись. По идее должно работать, хоть и писал на скорую руку
//var x = "123456789"; //var x = "1234567890"; var x = "не вернет 3333-и барана или не вернет 3333 барана"; var z = /(?!\b)(?=(?:\d{3})+(?=\b))/g var w = x.replace(z, " ");nerv
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
Пока шел домой, думал над твоим "вступлением" (?!^) - загадочная штука! Ведь работает же, хоть и не должна (пробел - ерунда)
Все получилось! Хоть \b и не работает с кириллицей, он относится к цифрам, поэтому все OK! У меня даже получилось так: (?!\b)(?=(\d{3})+\b) и так: (?=\B)(?=(\d{3})+\b) Проверь меня: (?!\b) это значит, что поиск идет не с самого начала числа (находим, но не записываем) (\d{3})+ это собственно, число, разделенное на группы по 3 цифры \b - это значит, что в своем поиске мы доходим до конца числа (?=...) это значит, что все найденные нами группы не включаются в результат (значит, получим именно позиции вставки пробелов)
Рассеянность (могу промахнуться мимо своего дома) меня преследует из-за перегруженности - вот сейчас придется продолжать работать - ни хрена на работе не успел, завтра меня будут немножко вешать
Пока шел домой, думал над твоим "вступлением" (?!^) - загадочная штука! Ведь работает же, хоть и не должна (пробел - ерунда)
Все получилось! Хоть \b и не работает с кириллицей, он относится к цифрам, поэтому все OK! У меня даже получилось так: (?!\b)(?=(\d{3})+\b) и так: (?=\B)(?=(\d{3})+\b) Проверь меня: (?!\b) это значит, что поиск идет не с самого начала числа (находим, но не записываем) (\d{3})+ это собственно, число, разделенное на группы по 3 цифры \b - это значит, что в своем поиске мы доходим до конца числа (?=...) это значит, что все найденные нами группы не включаются в результат (значит, получим именно позиции вставки пробелов)
Рассеянность (могу промахнуться мимо своего дома) меня преследует из-за перегруженности - вот сейчас придется продолжать работать - ни хрена на работе не успел, завтра меня будут немножко вешатьv__step
С уважением, Владимир
Сообщение отредактировал v__step - Понедельник, 09.01.2012, 23:56
На мой взгляд самое оптимальное решение. Только я бы не стал пользоваться запоминающими скобками, а использовал скобки группировки. Почему? Думаю, это влияет на скорость обработки. Узнаю ответ на свой вопрос, когда дочитаю до нужной главы) И, должен отметить, что Фридл уже сделал тонкий намек в эту сторону. Он был примерно таким: "запоминающие скобки я использую для примера, т.к. с ними наглядней".
Quote (v__step)
Проверь меня:
Я бы лучше и не сформулировал!
Quote (v__step)
У меня даже получилось так: (?!\b)(?=(\d{3})+\b)
На мой взгляд самое оптимальное решение. Только я бы не стал пользоваться запоминающими скобками, а использовал скобки группировки. Почему? Думаю, это влияет на скорость обработки. Узнаю ответ на свой вопрос, когда дочитаю до нужной главы) И, должен отметить, что Фридл уже сделал тонкий намек в эту сторону. Он был примерно таким: "запоминающие скобки я использую для примера, т.к. с ними наглядней".
Я могу ошибаться, но, кажется, поддержка склероза для скобок введена для vbs5.8 (надо проверить) Если так, зачем себя обманывать... хотя RegExp спокойно берет шаблоны с такими скобками... Твой последний шаблон всем хорош, только надо иметь в виду, что он работает с пробелами вокруг числа (для кириллицы можно и без пробелов) Если так, еще 1 вариант: (?=(\B\d{3})+\b) - он мне кажется самым понятным
Я могу ошибаться, но, кажется, поддержка склероза для скобок введена для vbs5.8 (надо проверить) Если так, зачем себя обманывать... хотя RegExp спокойно берет шаблоны с такими скобками... Твой последний шаблон всем хорош, только надо иметь в виду, что он работает с пробелами вокруг числа (для кириллицы можно и без пробелов) Если так, еще 1 вариант: (?=(\B\d{3})+\b) - он мне кажется самым понятнымv__step
С уважением, Владимир
Сообщение отредактировал v__step - Вторник, 10.01.2012, 09:26
Я смотрю, дело пошло) Еще такой вариант (см. ниже). Работает почти в любом фарше
// var x = "123456789"; // var x = "1234567890"; // var x = "ываыва123456789пвапв"; rus var x = "aasda123456789kllk;lk;"; // eng <- тут добавляет "лишний" пробел перед числом var z = /(?=\B(?:\d{3})+(?!\d))/g; var w = x.replace(z, " ");
Quote (v__step)
Твой последний шаблон всем хорош, только надо иметь в виду, что он работает с пробелами вокруг числа (для кириллицы можно и без пробелов)
Идеальных решений почти не бывает. Все зависит от контекста) Весьма хорошим считаю этот шаблон (?=\B(?:\d{3})+\b). Думаю, на нем надо остановиться Интересно было бы попытаться сделать для вещественных чисел)
Я смотрю, дело пошло) Еще такой вариант (см. ниже). Работает почти в любом фарше
// var x = "123456789"; // var x = "1234567890"; // var x = "ываыва123456789пвапв"; rus var x = "aasda123456789kllk;lk;"; // eng <- тут добавляет "лишний" пробел перед числом var z = /(?=\B(?:\d{3})+(?!\d))/g; var w = x.replace(z, " ");
Quote (v__step)
Твой последний шаблон всем хорош, только надо иметь в виду, что он работает с пробелами вокруг числа (для кириллицы можно и без пробелов)
Идеальных решений почти не бывает. Все зависит от контекста) Весьма хорошим считаю этот шаблон (?=\B(?:\d{3})+\b). Думаю, на нем надо остановиться Интересно было бы попытаться сделать для вещественных чисел)nerv
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
Сейчас читаю четвертую главу "Дж.Фридл - Регулярные выражения, 3-е изд.[2008].pdf" - Механика обработки регулярных выражений, признаться немного шокирован. Как Вы думаете, что вернут скобки? [vba]
Code
Sub io() Dim x As String x = "Copyright 2003." ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "^.*([0-9]+)" Set v = .Execute(x) End With End Sub
[/vba]
Оказывается, максимальные квантификаторы настолько жадные, что жрут все подряд и не могут остановиться. Поиск в данном примере будет идти следующем образом: ^ - находит начало строки, далее .* - жрет все вплоть до конца(!) строки, затем ([0-9]+) - с конца строки в обратном порядке (к началу), начинается проверка по одну символу данного условия и заканчивается на цифре 3 потому, что для квантификатора + приемлемым соответствием считается один символ. Т.е. скобки вернут цифру 3.
Сейчас читаю четвертую главу "Дж.Фридл - Регулярные выражения, 3-е изд.[2008].pdf" - Механика обработки регулярных выражений, признаться немного шокирован. Как Вы думаете, что вернут скобки? [vba]
Code
Sub io() Dim x As String x = "Copyright 2003." ' string With CreateObject("VBScript.RegExp") .Global = True .Pattern = "^.*([0-9]+)" Set v = .Execute(x) End With End Sub
[/vba]
Оказывается, максимальные квантификаторы настолько жадные, что жрут все подряд и не могут остановиться. Поиск в данном примере будет идти следующем образом: ^ - находит начало строки, далее .* - жрет все вплоть до конца(!) строки, затем ([0-9]+) - с конца строки в обратном порядке (к началу), начинается проверка по одну символу данного условия и заканчивается на цифре 3 потому, что для квантификатора + приемлемым соответствием считается один символ. Т.е. скобки вернут цифру 3.
ты что, сразу начал изучение regExp с Фридла? Ни фига себе! Там же почти 600 страниц... А я вообще-то имел в виду широко известную книгу автора Бен Форта "Регулярные выражения (10 минут на урок)" - всего 175 страниц... и то никак не соберусь прочесть
Quote (nerv)
а что такое "Форта"
ты что, сразу начал изучение regExp с Фридла? Ни фига себе! Там же почти 600 страниц... А я вообще-то имел в виду широко известную книгу автора Бен Форта "Регулярные выражения (10 минут на урок)" - всего 175 страниц... и то никак не соберусь прочесть Alex_ST
Alex_ST, Леш, Спасибо на добром слове. Кстати, что-то Володи давно не видно. Я сейчас регу для парсинга кода переделывал, чтобы шевелилась быстрее, да и ошибки некоторые убрал. Признаться, она начинает меня пугать)))
Alex_ST, Леш, Спасибо на добром слове. Кстати, что-то Володи давно не видно. Я сейчас регу для парсинга кода переделывал, чтобы шевелилась быстрее, да и ошибки некоторые убрал. Признаться, она начинает меня пугать)))
nerv, Саш, я с Володей в четверг списался в личке. У него какой-то завал на работе. Но я ему тонко намекнул на недобитые темы на форуме Он устыдился и обещал в ближайшие дни заглянуть.
Quote (nerv)
Признаться, она начинает меня пугать)))
уж если ТЕБЯ пугает, то что говорить об остальных, которые даже Бена Форту осилить заленились?
nerv, Саш, я с Володей в четверг списался в личке. У него какой-то завал на работе. Но я ему тонко намекнул на недобитые темы на форуме Он устыдился и обещал в ближайшие дни заглянуть.
Quote (nerv)
Признаться, она начинает меня пугать)))
уж если ТЕБЯ пугает, то что говорить об остальных, которые даже Бена Форту осилить заленились? Alex_ST