Имя: Пароль:
LIFE
 
OFF: Вопрос по регулярным выражениям и комментам в 1С
Ø
0 artbear
 
17.01.05
09:53
Народ, как через регулярные выражения задать шаблон для поиска выражения, которое не встречается в комментариях 1C ?
Типа чтобы не нашел строки
// Выражение
а = б; // Выражение
а нашел только
а = Выражение.
-------------------------------
Я использую
^[^/]*Выражение
все хорошо, кроме того, что не находит строки типа
а = б / Выражение
Можно ли как-нибудь обойти?
1 artbear
 
17.01.05
10:14
Вроде бы нашел для ВБ и ДЖскриптов у Мелкософта в помощи
--------------------
(?!pattern)
Negative lookahead matches the search string at any point where a string not matching pattern begins. This is a non-capturing match, that is, the match is not captured for possible later use. For example 'Windows (?!95|98|NT|2000)' matches "Windows" in "Windows 3.1" but does not match "Windows" in "Windows 2000". Lookaheads do not consume characters, that is, after a match occurs, the search for the next match begins immediately following the last match, not after the characters that comprised the lookahead.
--------------------
Но пока не знаю, как применить к своему вопросу.
2 artbear
 
17.01.05
11:40
up
3 artbear
 
17.01.05
13:14
Ну хоть кто-нибудь знает?
Дело принципа: как в регулярных выражениях указать, что данное выражение не должно встречаться!
4 artbear
 
17.01.05
14:50
up
5 mikeA
 
17.01.05
14:55
^([^/]/?)*Выражение
6 mikeA
 
17.01.05
14:58
The most complete book on regular expressions is almost certainly Jeffrey Friedl's Mastering Regular Expressions, published by O'Reilly. :)
7 artbear
 
17.01.05
14:59
(5) Спасибо. Действительно работает!
Применю в скриптах для Опенконф.
А что скажешь по (3) ?
8 Номер 6
 
17.01.05
15:22
(7)
Ну mikeA уже написал: [^pattern]
А вообще, для случая в (0), я думаю, надо так: ^\s*а\s*=\s*Выражение
9 mikeA
 
17.01.05
15:26
про (3) могу сказать три слова: windows must die
'Windows (?!95|98|NT|2000)' matches "Windows " in "Windows 3.1", NOT "Windows"
10 Gloom
 
17.01.05
15:28
(8)Не, нифига.
[^pattern] - будет искать все строки, в которых имеется любой символ, кроме p, a, t, e, r, n.
11 Номер 6
 
17.01.05
15:31
(10)
Категорически согласен ;-).
Вместо [^pattern] уместнее было написать [^/]
12 mikeA
 
17.01.05
15:34
мне показалось нужно не только "а=Выражение", а вообще "Выражение", которое встречается в тексте программы, а не в комментариях
13 artbear
 
17.01.05
15:38
(12) Именно так.
Твое выражение верно находит все случаи для текста программы.
14 Gloom
 
17.01.05
15:45
(13)...кроме одиночного слэша в начале строки...
15 artbear
 
17.01.05
15:46
(11) И что означает:
>>Вместо [^pattern] уместнее было написать [^/]
?
16 mikeA
 
17.01.05
16:02
(14) и правда... чувствовал, есть там косячок.
может быть вот так:
^(/?([^/]/?)*Выражение)
17 Gloom
 
17.01.05
16:16
(16)Собственно, от (5) не сильно отличается...
18 Angel IL
 
17.01.05
16:16
(0) о каких выражениях идет речь? они ведь зависят от исполняющей среды? или в 1С тоже есть регэкспы?
19 Angel IL
 
17.01.05
16:22
(0) о каких выражениях идет речь? они ведь зависят от исполняющей среды? или в 1С тоже есть регэкспы?
20 artbear
 
17.01.05
16:34
(14) А ты сам пробовал проверить??
Я проверил, эту строку не находит!!
так что исходная вариант Майка верен на 100%
21 mikeA
 
17.01.05
16:38
(16):
pattern:^ /?([^/]/?)*VAR
line: /VAR
match:(0:5) /VAR
(5):
^ ([^/]/?)*VAR
 /VAR
No match found.
(18) хз :) я тестирую мелочи типа этой на java.util.regex.*, использую на Python.
для 1С есть внешняя компонента, но я ее ни разу не использовал. и еще вроде можно вызывають VB, в котором тоже вроде они есть. но тут я могу сильно ошибаться.
а синтаксис везде один. POSIX, ну там плюс-минус...
22 Gloom
 
17.01.05
16:39
(20)Вот именно - "не находит"...
23 Gloom
 
17.01.05
16:43
(21)Вот теперь другое дело...
24 artbear
 
17.01.05
17:48
(21) В VBScript и JScript есть те же самые регулярные выражения, что и в Перле, и Питоне и т.д.
Возможно, правда, чуть послабее, но зато не уходящие от стандарта.
25 Gloom
 
17.01.05
17:53
(24)Нет, перл куда мощнее будет.
Например, в твоем случае пригодилось бы negative lookbehind условие, но vbscript и jscript оного не поддерживают...
Кстати, в .Net они появились.
26 artbear
 
17.01.05
18:51
(25) Согласен, что на перле/питоне мощнее. Но на каждую машину у клиента их не поставишь :(
потому приходится пользоваться тем, что есть в наличии.
27 Номер 6
 
18.01.05
07:38
Ага, внимательно прочитал (0).
Тогда можно вот так: ^(?!.*//).*Выражение
28 mikeA
 
18.01.05
08:26
(27) jsut perfect. коллективная разработка рулит однозначно :)))
29 artbear
 
18.01.05
08:42
(27) Да, хорошо получилось :)
Но (21) укладывается в стандарт синтаксиса регулярных выражений,
а (27) - только для VBScript и JSсript от Микрософта.
Хотя, конечно, для моей задачи (скрипты VBScript и JSсript для Опенконф) подходят оба решения.
Всем большое спасибо.
30 artbear
 
18.01.05
08:47
(21) Кстати, в 1С также просто использовать регулярные выражения, которые предоставляет Windows Script Host.
Т.е. даже можно внешнюю компоненту не пользовать.
31 Номер 6
 
18.01.05
08:50
Ну ваще-то я проверял в Expresso (это под .Net) ;-)
32 artbear
 
18.01.05
09:06
(31+) Тогда уточню, что (27) укладывается только в синтаксис регулярных выражений от Мелкософта.
Вообще говоря, мне разницы нет.
33 Номер 6
 
18.01.05
09:09
Кста, под JSсript не работают некоторые метасимволы для русских букв, например \w, а на VBScript все нормально. (Ну и кто Билли после этого?)
34 Gloom
 
18.01.05
09:26
(33)Кста, на VBS тоже не работают:
Set re = New RegExp
With re
  .Pattern="\w"
  MsgBox "Кириллица + \w = " & .Test("Не работает")
  MsgBox "Латиница + \w = " & .Test("Work")
End With
А вот в .Net с латиницей пучком:
Regex re = new Regex(@"\w");
Console.WriteLine(@"Кириллица + \w = " + (bool)(re.Match("Работает").Length>0));
Console.WriteLine(@"Латиница + \w = " + (bool)(re.Match("Work").Length>0));
35 artbear
 
18.01.05
09:33
(34) Ну никто не мешает вместо "\w" писать "\w|[А-Яа-я]"
36 Gloom
 
18.01.05
09:38
(35)Это понятно, кстати, так правильнее будет: "\w|[А-Яа-яёЁ]"
37 Gloom
 
18.01.05
09:43
+36
Вернее даже так: "\w|[А-яёЁ]"
38 trdm
 
18.01.05
10:17
(37) а почему не [а-яа-Я]?
39 trdm
 
18.01.05
10:20
(19) Есть, поищи в ветках по телепату там приводился пример работы с RE в 1С....
40 Gloom
 
18.01.05
10:21
(38)Диапазон должен задаваться в порядке кодов символов:
[А-я] => [192-255]
Символы ё(184) и Ё(168) лежат за пределами этого диапазона, поэтому д.б. указаны отдельно...
41 trdm
 
18.01.05
10:22
(37) это ты к тому что ё и Ё в таблице символов лежат вне основного диапазона символов?
42 trdm
 
18.01.05
10:29
+(39) кстати помогает когда "Найти(,)" артачится :)
(40) понял..
43 mikeA
 
18.01.05
10:45
(29-37) на java 1.4 все в юникоде. только в него надо правильно читать, если обычный текст. по умолчанию кодовая страница та что в ОС (1251). так что текст и должен быть в этой кодировке, или использовать соответствующий charset. тогда интернациональные символы ищутся через
\p{Lu} An uppercase letter (simple category)
[\p{L}&&[^\p{Lu}]] Any letter except an uppercase letter (subtraction)
\p{L} lowercase letter (почему-то в документации нет)
^ [\p{Lu}\p{L}]+
 АаБбВв
(0:7) АаБбВв
и negative/positive lookahead/lookbehind там тоже есть. как оказалось :)