|
|
|
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 там тоже есть. как оказалось :) |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |