регулярные выражения в программном коде

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: регулярные выражения в программном коде

Непрочитанное сообщение Olej » 28 дек 2022, 12:45

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 ... но думаю что она сама предоставляет точно те же классы любой запускаемой программе.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: регулярные выражения в программном коде

Непрочитанное сообщение Olej » 28 дек 2022, 21:54

Olej писал(а):
16 дек 2022, 21:45
Python.
Опять Python ...
Там я перебрал разные виды API, но приложения подобного остальным языкам не сделал. Восполняю :lol: :

Код: Выделить всё

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
--------------------

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей