Имя: Пароль:
1C
 
РегЭкспы: как указать в паттерне исключение символа из результата
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
https://i.imgur.com/6PRvwAL.png
результат получен с помощью http://catalog.mista.ru/public/75941/
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
и с запятой в (18) ок также
https://i.imgur.com/qMaxVg4.png
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)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший