|   |   | 
| 
 | РегЭкспы: как указать в паттерне исключение символа из результата | ☑ | ||
|---|---|---|---|---|
| 0
    
        Zhuravlik 15.03.16✎ 11:19 | 
        Добрый день. Сегодня открыл для себя notepad и регЭкспы)) На самом деле открыл давно, но захотел большего. Мучаю текст запроса - хочу в нем все вхождения &П заменить на &НачДата. Дело в том что там есть еще и параметры типа &Пользователь, &ПорядокПрименения-чего-то-там и т. д. 
 Вот такой паттерн возвращает мне все вхождения "&П," - (&П[^А-я]{1}). А как мне получить именно все вхождения "&П"? Ясно, что могу и так обойтись - заменить "&П," на "&НачДата," и в коде поубирать лишнее - если будет (оно же найдет и "&П)" и пр. ). Вопрос уже чисто ради интереса - как сделать. Читал вики и т. д. - не пойму, не вижу. | |||
| 1
    
        Zhuravlik 15.03.16✎ 11:51 | 
        ап, кто-нибудь да знает     | |||
| 2
    
        Кирпич 15.03.16✎ 11:56 | 
        щас в гугле поищу     | |||
| 3
    
        Serginio1 15.03.16✎ 11:59 | ||||
| 4
    
        Zhuravlik 15.03.16✎ 12:12 | 
        Блин, да читал я это, неужели сложно пальцем ткнуть?     | |||
| 5
    
        Serginio1 15.03.16✎ 12:13 | 
        (4) Так выдели группы и заменяй     | |||
| 6
    
        Fragster гуру 15.03.16✎ 12:13 | 
        .replace     | |||
| 7
    
        Кирпич 15.03.16✎ 12:14 | 
        (4) так мы сами не знаем. щас разберемся.     | |||
| 8
    
        Fragster гуру 15.03.16✎ 12:17 | ||||
| 9
    
        mooo 15.03.16✎ 12:19 | 
        (0)
 Ctrl - H Искать &П Заменить &НачДата Галка Искать слово целиком | |||
| 10
    
        Fragster гуру 15.03.16✎ 12:21 | 
        (9) да не , просто автор не очень умеет работать с СКД     | |||
| 11
    
        Fragster гуру 15.03.16✎ 12:21 | 
        или, там, построителем     | |||
| 12
    
        Zhuravlik 15.03.16✎ 12:22 | 
        (5) У меня в результате поиска символ в конце, а мне замену нужно произвести предварительно от него избавившись
 (8) Поищи в строке &П, (10) Поспешные выводы такие поспешные... | |||
| 13
    
        ЕщеОдин Программист 15.03.16✎ 12:22 | 
        была такая вещь: предпроверка не равно. Синтаксис по памяти не помню.     | |||
| 14
    
        Fragster гуру 15.03.16✎ 12:24 | 
        вот так лучше: &П((\s)|^)     | |||
| 15
    
        Fragster гуру 15.03.16✎ 12:24 | 
        (12) т.е. автор умеет работать с СКД или построителем? И это у него просто спортивный интерес?     | |||
| 16
    
        Кирпич 15.03.16✎ 12:25 | 
        ну у меня так ищет нормально
 "&П[^А-я]" | |||
| 17
    
        Zhuravlik 15.03.16✎ 12:27 | 
        (14) нет
 (15) типа того, прочитай (0). (16) Такой паттерн вернет "&П," - с ЗАПЯТОЙ В КОНЦЕ))) Вопрос в том как исключить последние символы из найденного? | |||
| 18
    
        Fragster гуру 15.03.16✎ 12:28 | ||||
| 19
    
        Zhuravlik 15.03.16✎ 12:29 | 
        Я думал тут найдется кто-то уже попадавший на такое - вижу что вы по моим же шишкам идете     | |||
| 20
    
        Fragster гуру 15.03.16✎ 12:29 | 
        (17) не надо искать, в (0) - заменить.
 вот, в (18) неплохое решение для конкретного случая | |||
| 21
    
        Fragster гуру 15.03.16✎ 12:30 | ||||
| 22
    
        Zhuravlik 15.03.16✎ 12:31 | 
        (21) Добавь в проверочную строку параметр "&Пользователь"
 (20) Да интерес чисто спортивный) С запросом я уже разобрался. | |||
| 23
    
        ЕщеОдин Программист 15.03.16✎ 12:32 | 
        (17) предпроверка не равно не включает проверенные символы     | |||
| 24
    
        Zhuravlik 15.03.16✎ 12:34 | 
        (8) Я тестился здесь http://www.regexr.com/ - поудобней
 В общем, если получится отпишусь. Спасибо всем за участие. | |||
| 25
    
        Кирпич 15.03.16✎ 12:35 | 
        ну тогда так
 "&П(?![А-я])" | |||
| 26
    
        Fragster гуру 15.03.16✎ 12:36 | 
        (22) хм. походу реализация регэкспа от майкрософт считает русские буквы на символами слова. Тогда надо \W заменить на [^атутдиапазоныразрешенныхсимволов], например [^a-zА-Я0-9_]
 ну и конец строки у меня неправильный :) https://i.imgur.com/juYdXK2.png | |||
| 27
    
        Zhuravlik 15.03.16✎ 12:36 | 
        (25) эм, надо подумать, спасибо)     | |||
| 28
    
        Кирпич 15.03.16✎ 12:37 | 
        (27) чо там думать. оно работает.     | |||
| 29
    
        Zhuravlik 15.03.16✎ 12:38 | 
        (28) Я наверное очень странно себя поведу, если попробую разобраться "как"))     | |||
| 30
    
        Fragster гуру 15.03.16✎ 12:38 | 
        (28) не, не работает https://i.imgur.com/aEXnwNo.png     | |||
| 31
    
        Кирпич 15.03.16✎ 12:39 | 
        (29) это просмотр вперед. здесь нашел
 https://ru.wikipedia.org/wiki/Регулярные_выражения | |||
| 32
    
        dimalf 15.03.16✎ 12:41 | 
        Добрый день!
 Если у Вас в тексте после &П пробел, то в окне поиска/замены поставьте галочку "Слова целиком" | |||
| 33
    
        Fragster гуру 15.03.16✎ 12:41 | 
        (31) да, так неплохо получается, если подкорректировать выражение и замену https://i.imgur.com/v8nDsmF.png     | |||
| 34
    
        Кирпич 15.03.16✎ 12:42 | 
        (33) ну принцип главное ясен, а это уже детали.     | |||
| 35
    
        mooo 15.03.16✎ 12:48 | 
        (?:\W|^)(&П)(?:\W|$)     | |||
| 36
    
        Лефмихалыч 15.03.16✎ 12:50 | 
        а зачем регэкспы, чтобы заменить конкретно вот эту последовательность символов "&П"? Регэкспы нужны, когда последовательность не конкретная и там могут бытьвсякие разницы по дороге.     | |||
| 37
    
        Fragster гуру 15.03.16✎ 12:50 | 
        (36) см. скриншот из (33). чтобы не заменить лишнего.     | |||
| 38
    
        Fragster гуру 15.03.16✎ 12:52 | 
        (35) уже было. реализация от майкрософта не считает русские буквы за составляющие слова. ну и да. прежде, чем писать, рекомендую все-таки проверить на http://catalog.mista.ru/public/75941/
 вот предварительный тест для проверки: Проверка &П Проверка &П &П1 Проверка &П=&П1 Проверка &П_ Проверка (&П) Проверка &П, Проверка &Пользователь | |||
| 39
    
        Лефмихалыч 15.03.16✎ 13:15 | 
        (38) это без регэкспов делается средствами конфигуратора - ctrl+H, подстрока поиска "&П", и обязательно включить галку про "целиком".
 Веселопедисты чоротовы :) | |||
| 40
    
        Кирпич 15.03.16✎ 13:17 | 
        (39) человек не решает конкретную задачу, а регэкспы изучает на данном примере. при чем лисапед.     | |||
| 41
    
        Zhuravlik 15.03.16✎ 13:26 | 
        (39) Во блин)) Истина всегда где-то рядом. 
 (40) Да не, все правильно - начал то я как-раз с того что запрос стал регэкспами ковырять) Сколько раз этой заменой пользовался, тут протупил. Просто анализировать большие тексты запросов (на вхождение подстрок) - удобнее в блокноте/с регэкспами - чтобы подсветка была, даже забыл как-то про конфигуратор. Уже понятно что в регулярках так просто не сделать. А раз просто нельзя, то сложно не надо. Всем спасибо за участие. | |||
| 42
    
        Лефмихалыч 15.03.16✎ 13:27 | 
        (41) галка "целиком" заменит "&П_" на "&ДатаНач_", так что будь на стрёме и не расслабляйся     | |||
| 43
    
        mooo 15.03.16✎ 13:31 | 
        (41) см (9) )))
 регекспом еще вариант (?=[^A-Za-z0-9_А-я]|^)(&П)(?=[^A-Za-z0-9_А-я]|$) | |||
| 44
    
        Zhuravlik 15.03.16✎ 13:38 | 
        (43) Тогда мой разум еще был во власти регэкспа. Ну, че тут скажешь....
 (?=[^A-Za-z0-9_А-я]|^)(&П)(?=[^A-Za-z0-9_А-я]|$) - не, это не вариант)) | |||
| 45
    
        Serginio1 15.03.16✎ 15:51 | 
        А вот так работает
 input = "&П в начале строки |в середине &П строки |в конце строки &П |&Пользователь | серед &Пользователь"; pattern = "\b(&П)\b"; Regex = Врап.ПолучитьТип("System.Text.RegularExpressions.Regex"); // Получаем совпадения в экземпляре класса Match replacement1 = "&НачДата"; input = Regex.Replace(input, pattern, replacement1); Сообщить(input); | |||
| 46
    
        Serginio1 15.03.16✎ 15:53 | 
        45 Прошу прощения не то     | |||
| 47
    
        Serginio1 15.03.16✎ 16:43 | 
        Такой патерн проходит
 pattern = "&П\b" Не пойму ка добавить в начале границу слова \b Соответствует границе слова, т.е. соответствует позиции между символом \w и символом \W или между символом \w и началом или концом строки. | |||
| 48
    
        Кирпич 15.03.16✎ 16:52 | 
        (47) Точно!     | |||
| 49
    
        Serginio1 15.03.16✎ 16:57 | 
        pattern = "\^|\s(&П)\b";
 Вот такой работает | |||
| 50
    
        Кирпич 15.03.16✎ 17:03 | 
        (49) да и "&П\b" работает нормально     | |||
| 51
    
        Fragster гуру 15.03.16✎ 17:16 | ||||
| 52
    
        Timon1405 15.03.16✎ 17:19 | 
        разве \b работает с русскими буквами? я проверил пример тут http://regexr.com/ и в RegexBuddy, и везде не выдает совпадений. А вот если заменить П на F, то "&F\b" например находит.
 в описании написано «\b» Assert position at a word boundary (position preceded or followed—but not both—by an ASCII letter, digit, or underscore) «\b» , считается ли П как ASCII в данном случае? | |||
| 53
    
        Fram 15.03.16✎ 17:19 | 
        &П\w*     | |||
| 54
    
        kofeinik 15.03.16✎ 17:20 | 
        А почему нельзя просто поставить пробел после &П?     | |||
| 55
    
        Fram 15.03.16✎ 17:21 | 
        (53)+ гоню )     | |||
| 56
    
        Serginio1 15.03.16✎ 17:26 | 
        (50) Хотелось, что бы начиналось с "П
 Вот так работает Стр = "&П в начале . строки |в середине &П строки |в конце КП . строки &П |&Пользователь | серед &Пользователь"; pattern = "(^|\s)(&П)\b"; Regex = Врап.ПолучитьТип("System.Text.RegularExpressions.Regex"); RegexOptions = Врап.ПолучитьТип("System.Text.RegularExpressions.RegexOptions"); ргекс = Врап.СоздатьОбъект(Regex,pattern,Врап.OR(RegexOptions.Multiline,RegexOptions.IgnoreCase)); СтрокаЗамены = "$1&НачДата"; стр = ргекс.Replace(Стр,СтрокаЗамены); Сообщить(стр); | |||
| 57
    
        Timon1405 15.03.16✎ 17:27 | 
        (54) например, запрос заканчивается словами 
 ГДЕ Регистр.Период>&П <--тут нет пробела, а стоит конецстроки | |||
| 58
    
        Serginio1 15.03.16✎ 17:27 | 
        (54) Может быть в конце строки     | |||
| 59
    
        Fram 15.03.16✎ 17:30 | 
        &П(?=[^0-9_А-я])     | |||
| 60
    
        Zhuravlik 15.03.16✎ 17:32 | 
        (56) Зачем вы так мучаетесь? Воспользуйтесь http://regexr.com/ - отличный сервис. 
 На котором я проверял в т.ч. "\b" - с ним не прокатило. Заразил я народ. Вот она, идея-вирус) | |||
| 61
    
        Timon1405 15.03.16✎ 17:33 | 
        (59) у вас не сработает пример из (57)     | |||
| 62
    
        Fram 15.03.16✎ 17:34 | 
        (61) Попробуй     | |||
| 63
    
        kofeinik 15.03.16✎ 17:34 | 
        (57) Ну так в два прохода, вначале поменять "&П ", потом &П$     | |||
| 64
    
        Serginio1 15.03.16✎ 17:36 | 
        (60) А у меня прокатывает.
 &НачДата в начале . строки в середине &НачДата строки в конце КП . строки &НачДата &Пользователь серед &Пользователь | |||
| 65
    
        Fram 15.03.16✎ 17:39 | 
        вот вариант с концом текста 
 &П(?=[^0-9_А-я])|&П$ | |||
| 66
    
        Fram 15.03.16✎ 17:42 | ||||
| 67
    
        Fram 15.03.16✎ 17:43 | 
        приз какой победителю? :)     | |||
| 68
    
        Timon1405 15.03.16✎ 17:44 | 
        (67) &Победителю &Приз &Пирожок)     | |||
| 69
    
        Fram 15.03.16✎ 17:48 | 
        я тут недавно логи циски регуляркой парсил. вот это было развлечение )) 
 во первых хочется выразить благодарность разработчикам этих логов. а АДу им отдельный котел точно должен быть выделен | |||
| 72
    
        Fragster гуру 21.03.16✎ 13:13 | 
        расширил функциональность: теперь в окне выводится сразу и поиск и замена, + в поиске подсвечиваются найденные фрагменты и выводится всплывающая подсказка с деталями:    | |||
| 73
    
        Timon1405 21.03.16✎ 13:26 | 
        (72) круто кончено, но вы же в курсе что есть https://www.regexbuddy.com/?
 там есть, например, библиотека шаблонов, отладка, разворачивание регэкспа в дерево. | |||
| 74
    
        Fragster гуру 21.03.16✎ 14:26 | 
        (73) я в курсе, что есть. делал для 1с и встраивания в доп. обработки БСП, чтобы никуда не ходить :)     | |||
| 75
    
        Fragster гуру 21.03.16✎ 14:26 | 
        к тому же диалекты немного отличаются, что заработает в regexp buddy не всегда заработает в vbscript.regex     | |||
| 76
    
        Fragster гуру 21.03.16✎ 14:27 | 
        ну и 40 баксов - как-то крутовато, нет?     | |||
| 77
    
        Serginio1 21.03.16✎ 14:41 | 
        (56) Добавь еще для нетовского RegularExpressions (56)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |