Страница 4 из 4
Re: регулярные выражения в программном коде
Добавлено: 28 дек 2022, 12:45
Olej
Olej писал(а): ↑28 дек 2022, 01:44
В итоге:
Относительно двух JAR архивов, собираемых и запускаемых разными способами:
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ls -l regexk*.jar
-rw-rw-r-- 1 olej olej 4694586 дек 28 00:39 regexk1.jar
-rw-rw-r-- 1 olej olej 2213 дек 28 00:39 regexk1k.jar
Разница в размере
в 2121 раз!
Но ничего удивительного - смотрим состав:
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ unzip -l regexk1k.jar
Archive: regexk1k.jar
Length Date Time Name
--------- ---------- ----- ----
78 1980-01-01 00:00 META-INF/MANIFEST.MF
3084 1980-01-01 00:00 Regexk1Kt.class
39 1980-01-01 00:00 META-INF/main.kotlin_module
--------- -------
3201 3 files
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ unzip -l regexk1.jar | head
Archive: regexk1.jar
Length Date Time Name
--------- ---------- ----- ----
78 1980-01-01 00:00 META-INF/MANIFEST.MF
3084 1980-01-01 00:00 Regexk1Kt.class
39 1980-01-01 00:00 META-INF/main.kotlin_module
596 1980-01-01 00:00 kotlin/collections/ArraysUtilJVM.class
2721 1980-01-01 00:00 kotlin/jvm/internal/AdaptedFunctionReference.class
898 1980-01-01 00:00 kotlin/jvm/internal/CallableReference$NoReceiver.class
4173 1980-01-01 00:00 kotlin/jvm/internal/CallableReference.class
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ unzip -l regexk1.jar | wc -l
2819
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ unzip -l regexk1.jar | grep class$ | wc -l
2802
Во 2-м случае - сборка под запуск в JVM -
тот же (судя по размеру) класс Regexk1Kt.class ... но и + ущё 2802 класса исполняющей системы JVM.
Я не большой знаток Java чтобы судить что там и как берёт исполняющая система Kotlin ... но думаю что она
сама предоставляет точно те же классы
любой запускаемой программе.
Re: регулярные выражения в программном коде
Добавлено: 28 дек 2022, 21:54
Olej
Olej писал(а): ↑16 дек 2022, 21:45
Python.
Опять
Python ...
Там я перебрал разные виды API, но приложения
подобного остальным языкам не сделал. Восполняю
:
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ cat regexp2.py
#!/usr/bin/python3
import sys
import re
if len( sys.argv ) > 1:
pattern = sys.argv[ 1 ]
else:
pattern = r'\d\d\d'
try:
rex = re.compile( pattern, flags = re.IGNORECASE )
except Exception as exc:
print( "error: {}".format( exc ) )
sys.exit( 1 )
while(True):
buf = sys.stdin.readline()[ :-1 ]
if 0 == len( buf ): # завершение работы
break
match = rex.search( buf )
if match:
for i in range( 0, len( match.groups() ) + 1 ):
print("{}/{} : {}".format(
match.span( i )[ 0 ], match.span( i )[ 1 ],
match.group( i ) ) )
else:
print( "no match found" )
print( "--------------------" )
re.purge()
sys.exit( 0 )
Поскольку Python язык интерпретирующий (в значительной мере), то компиляция здесь не нужна, и сразу переходим к выполнению:
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regexp2.py "([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)"
это IP: 192.168.1.3
8/19 : 192.168.1.3
8/11 : 192
12/15 : 168
16/17 : 1
18/19 : 3
--------------------
192.168.1
no match found
--------------------
192.168.1.3
0/11 : 192.168.1.3
0/3 : 192
4/7 : 168
8/9 : 1
10/11 : 3
--------------------
Ещё один короткий пример, для того чтобы утведиться в том, что Python (его API регулярных выражений) считает позиции отождествлений (для строк мультибайтных локализованных символов) не в байтах, но в символах (шаблон программы по умолчанию: r'\d\d\d' — 3 цифровых символа):
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regexp2.py
1234
0/3 : 123
--------------------
число 987
6/9 : 987
--------------------
olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regexp2.py
число this 987
11/14 : 987
--------------------