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

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

Модератор: Olej

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

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

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

Olej писал(а):
19 дек 2022, 01:56
Всё!
Опускаюсь в каталог проекта и делаю построение проекта - вот в этом месте и подтягиваются по сети все крейты, требуемые по зависимостям (рекурсивно если нужно):

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ cd regexrs1/

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ time cargo build --verbose
    Updating crates.io index
  Downloaded memchr v2.5.0
  Downloaded aho-corasick v0.7.20
  Downloaded regex v1.7.0
  Downloaded regex-syntax v0.6.28
  Downloaded 4 crates (716.0 KB) in 0.88s
   Compiling memchr v2.5.0
   Compiling regex-syntax v0.6.28
     Running `rustc --crate-name build_script_build --edition=2018 /home/olej/.cargo/registry/src/github.com-1ecc6299db9ec823/memchr-2.5.0/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=0c2d17e75a62c41d -C extra-filename=-0c2d17e75a62c41d --out-dir /home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/build/memchr-0c2d17e75a62c41d -L dependency=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps --cap-lints allow`
     Running `rustc --crate-name regex_syntax --edition=2018 /home/olej/.cargo/registry/src/github.com-1ecc6299db9ec823/regex-syntax-0.6.28/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="unicode"' --cfg 'feature="unicode-age"' --cfg 'feature="unicode-bool"' --cfg 'feature="unicode-case"' --cfg 'feature="unicode-gencat"' --cfg 'feature="unicode-perl"' --cfg 'feature="unicode-script"' --cfg 'feature="unicode-segment"' -C metadata=a173cda7ca84e08e -C extra-filename=-a173cda7ca84e08e --out-dir /home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps -L dependency=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps --cap-lints allow`
     Running `/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/build/memchr-0c2d17e75a62c41d/build-script-build`
     Running `rustc --crate-name memchr --edition=2018 /home/olej/.cargo/registry/src/github.com-1ecc6299db9ec823/memchr-2.5.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=4b43828fec892511 -C extra-filename=-4b43828fec892511 --out-dir /home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps -L dependency=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps --cap-lints allow --cfg memchr_runtime_simd --cfg memchr_runtime_sse2 --cfg memchr_runtime_sse42 --cfg memchr_runtime_avx`
   Compiling aho-corasick v0.7.20
     Running `rustc --crate-name aho_corasick --edition=2018 /home/olej/.cargo/registry/src/github.com-1ecc6299db9ec823/aho-corasick-0.7.20/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=4f726f2802425d53 -C extra-filename=-4f726f2802425d53 --out-dir /home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps -L dependency=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps --extern memchr=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps/libmemchr-4b43828fec892511.rmeta --cap-lints allow`
   Compiling regex v1.7.0
     Running `rustc --crate-name regex --edition=2018 /home/olej/.cargo/registry/src/github.com-1ecc6299db9ec823/regex-1.7.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="aho-corasick"' --cfg 'feature="default"' --cfg 'feature="memchr"' --cfg 'feature="perf"' --cfg 'feature="perf-cache"' --cfg 'feature="perf-dfa"' --cfg 'feature="perf-inline"' --cfg 'feature="perf-literal"' --cfg 'feature="std"' --cfg 'feature="unicode"' --cfg 'feature="unicode-age"' --cfg 'feature="unicode-bool"' --cfg 'feature="unicode-case"' --cfg 'feature="unicode-gencat"' --cfg 'feature="unicode-perl"' --cfg 'feature="unicode-script"' --cfg 'feature="unicode-segment"' -C metadata=0d776592171c07d4 -C extra-filename=-0d776592171c07d4 --out-dir /home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps -L dependency=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps --extern aho_corasick=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps/libaho_corasick-4f726f2802425d53.rmeta --extern memchr=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps/libmemchr-4b43828fec892511.rmeta --extern regex_syntax=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps/libregex_syntax-a173cda7ca84e08e.rmeta --cap-lints allow`
   Compiling regexrs1 v0.1.0 (/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1)
     Running `rustc --crate-name regexrs1 --edition=2021 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=d15ba89530402bff -C extra-filename=-d15ba89530402bff --out-dir /home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps -C incremental=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/incremental -L dependency=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps --extern regex=/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target/debug/deps/libregex-0d776592171c07d4.rlib`
    Finished dev [unoptimized + debuginfo] target(s) in 8m 13s

real	8m13,706s
user	7m25,057s
sys	0m22,242s
Большую часть времени этих 8 минут - скачивание индексов репозитория crates.io.

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

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

Непрочитанное сообщение Olej » 19 дек 2022, 02:20

Olej писал(а):
19 дек 2022, 02:12
делаю построение проекта - вот в этом месте и подтягиваются по сети все крейты, требуемые по зависимостям (рекурсивно если нужно):

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ tree target 
target
├── CACHEDIR.TAG
└── debug
    ├── build
    │   ├── memchr-0c2d17e75a62c41d
    │   │   ├── build-script-build
    │   │   ├── build_script_build-0c2d17e75a62c41d
    │   │   └── build_script_build-0c2d17e75a62c41d.d
    │   └── memchr-67458b3569d6441a
    │       ├── invoked.timestamp
    │       ├── out
    │       ├── output
    │       ├── root-output
    │       └── stderr
    ├── deps
    │   ├── aho_corasick-4f726f2802425d53.d
    │   ├── libaho_corasick-4f726f2802425d53.rlib
    │   ├── libaho_corasick-4f726f2802425d53.rmeta
    │   ├── libmemchr-4b43828fec892511.rlib
    │   ├── libmemchr-4b43828fec892511.rmeta
    │   ├── libregex-0d776592171c07d4.rlib
    │   ├── libregex-0d776592171c07d4.rmeta
    │   ├── libregex_syntax-a173cda7ca84e08e.rlib
    │   ├── libregex_syntax-a173cda7ca84e08e.rmeta
    │   ├── memchr-4b43828fec892511.d
    │   ├── regex-0d776592171c07d4.d
    │   ├── regexrs1-d15ba89530402bff
    │   ├── regexrs1-d15ba89530402bff.d
    │   └── regex_syntax-a173cda7ca84e08e.d
    ├── examples
    ├── incremental
    │   └── regexrs1-2pbl309jp9pgn
    │       ├── s-gggostywmm-4avx1f-12hkq7ewi8xye
    │       │   ├── 276dcaaoicv8zpq0.o
    │       │   ├── 2fnzpp4iupodvl8.o
    │       │   ├── 2tl2ld8yhtchetrh.o
    │       │   ├── 3n5pe15f0lv51l5d.o
    │       │   ├── 40gakhh67uip5dqw.o
    │       │   ├── 4pfymdto29bw4096.o
    │       │   ├── ah845he6g9e7izc.o
    │       │   ├── dep-graph.bin
    │       │   ├── query-cache.bin
    │       │   └── work-products.bin
    │       └── s-gggostywmm-4avx1f.lock
    ├── regexrs1
    └── regexrs1.d

10 directories, 35 files

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ ls -l target/debug/regexrs1
-rwxrwxr-x 2 olej olej 15820288 дек 19 01:07 target/debug/regexrs1

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ file target/debug/regexrs1
target/debug/regexrs1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f72d741950209620c864060a5e86a38df8bd841c, for GNU/Linux 3.2.0, with debug_info, not stripped

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ ./target/debug/regexrs1
Теперь я могу как угодно дополнять этот исполнимый код! :!:

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

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

Непрочитанное сообщение Olej » 19 дек 2022, 02:25

Olej писал(а):
19 дек 2022, 02:12
вот в этом месте и подтягиваются по сети все крейты, требуемые по зависимостям (рекурсивно если нужно):
Olej писал(а):
19 дек 2022, 02:12

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ time cargo build --verbose
    Updating crates.io index
  Downloaded memchr v2.5.0
  Downloaded aho-corasick v0.7.20
  Downloaded regex v1.7.0
  Downloaded regex-syntax v0.6.28
  Downloaded 4 crates (716.0 KB) in 0.88s
...
Итого, подтянулись 4 крейта (библиотеки) ... которые видно ещё и так:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ pwd
/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ cat Cargo.lock 
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3

[[package]]
name = "aho-corasick"
version = "0.7.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
dependencies = [
 "memchr",
]

[[package]]
name = "memchr"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"

[[package]]
name = "regex"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
dependencies = [
 "aho-corasick",
 "memchr",
 "regex-syntax",
]

[[package]]
name = "regex-syntax"
version = "0.6.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"

[[package]]
name = "regexrs1"
version = "0.1.0"
dependencies = [
 "regex",
]
И вот они все здесь:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1/target$ ls -l debug/deps/
итого 65872
-rw-rw-r-- 1 olej olej     7752 дек 19 01:07 aho_corasick-4f726f2802425d53.d
-rw-rw-r-- 1 olej olej  6119548 дек 19 01:07 libaho_corasick-4f726f2802425d53.rlib
-rw-rw-r-- 1 olej olej  1734823 дек 19 01:07 libaho_corasick-4f726f2802425d53.rmeta
-rw-rw-r-- 1 olej olej  3016832 дек 19 01:07 libmemchr-4b43828fec892511.rlib
-rw-rw-r-- 1 olej olej  1536298 дек 19 01:07 libmemchr-4b43828fec892511.rmeta
-rw-rw-r-- 1 olej olej 13023728 дек 19 01:07 libregex-0d776592171c07d4.rlib
-rw-rw-r-- 1 olej olej  1746507 дек 19 01:07 libregex-0d776592171c07d4.rmeta
-rw-rw-r-- 1 olej olej 16911260 дек 19 01:07 libregex_syntax-a173cda7ca84e08e.rlib
-rw-rw-r-- 1 olej olej  7472723 дек 19 01:07 libregex_syntax-a173cda7ca84e08e.rmeta
-rw-rw-r-- 1 olej olej    10269 дек 19 01:07 memchr-4b43828fec892511.d
-rw-rw-r-- 1 olej olej     7517 дек 19 01:07 regex-0d776592171c07d4.d
-rwxrwxr-x 2 olej olej 15820288 дек 19 01:07 regexrs1-d15ba89530402bff
-rw-rw-r-- 1 olej olej      237 дек 19 01:07 regexrs1-d15ba89530402bff.d
-rw-rw-r-- 1 olej olej    12402 дек 19 01:07 regex_syntax-a173cda7ca84e08e.d
И наверняка в таком скачанном виде их можно подключить к консольному компилятору rustc.

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

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

Непрочитанное сообщение Olej » 19 дек 2022, 02:32

Olej писал(а):
19 дек 2022, 02:25
Итого, подтянулись 4 крейта (библиотеки) ... которые видно ещё и так:
И скачиваются они вот отсюда ... :
https://crates.io/crates?page=1370
Снимок экрана от 2022-12-19 01-10-45.png
Снимок экрана от 2022-12-19 01-10-45.png (122.51 КБ) 377 просмотров
https://crates.io/crates/regex
Снимок экрана от 2022-12-19 01-28-42.png
Снимок экрана от 2022-12-19 01-28-42.png (192.81 КБ) 377 просмотров
...
Usage

To bring this crate into your repository, either add regex to your Cargo.toml, or run cargo add regex.

Here's a simple example that matches a date in YYYY-MM-DD format and prints the year, month and day:

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

use regex::Regex;

fn main() {
    let re = Regex::new(r"(?x)
(?P<year>\d{4})  # the year
-
(?P<month>\d{2}) # the month
-
(?P<day>\d{2})   # the day
").unwrap();
    let caps = re.captures("2010-03-14").unwrap();

    assert_eq!("2010", &caps["year"]);
    assert_eq!("03", &caps["month"]);
    assert_eq!("14", &caps["day"]);
}
...

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

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

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

Olej писал(а):
15 дек 2022, 01:17
2. Это было только про регулярные выражения в коде C и C++ ... нужно дополнить коротко по состоянию дел в новых (современных) языках: Python, Go, Rust, Kotlin ...
Оставив в покое новые языки программирования ... временно :lol:
Olej писал(а):
15 дек 2022, 01:17
1. Всё это было написано максимум в 2016 году ... кой чего можно бы добавить;
Обновил и сильно дополнил базовую часть, то что касается как-раз C и C++.
Вот теперь как выглядит оглавление текста:

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

Оглавление
Регулярные выражения (предисловие)	1
	Структура и ограничения этого текста	2
	Пару слов про авторские права	2
Замечания относительно регулярных выражений	3
	Как это работает в утилитах GNU	4
	Как это работает из программного кода	5
Регулярные выражения в C	6
	PCRE	11
		PCRE и POSIX нотация	15
	Широкие символы Unicode	16
Регулярные выражения в C++	18
Поздние языки программирования	22
	Python	22
	Go	24
	Rust	25
	Kotlin	25
Использование регулярных выражений	25
Литература и сетевые ресурсы
Вложения
regex_20.odt
(466.7 КБ) 27 скачиваний
Regex.20.tgz
(46.61 КБ) 29 скачиваний

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

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

Непрочитанное сообщение Olej » 25 дек 2022, 16:36

Olej писал(а):
24 дек 2022, 21:02
то что касается как-раз C и C++
И снова возвращаясь в тему...
Go

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ go fmt regexg2.go 
regexg2.go

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ cat regexg2.go 
package main

import (
	"bufio"
	"fmt"
	"os"
	"regexp"
)

func main() {
	pattern := "."
	if len(os.Args) > 1 {
		pattern = os.Args[1]
	}
	re, err := regexp.Compile(pattern)
	if err != nil {
		fmt.Println(err)
		return
	}
	sc := bufio.NewScanner(os.Stdin)
	for sc.Scan() {
		buf := sc.Text()
		if 0 == len(buf) { // выход
			break
		}
		res := re.FindAllString(buf, -1)
		if nil == res {
			fmt.Println("no match found")
			continue
		}
		ind := re.FindAllStringIndex(buf, -1)
		for i := range res {
			fmt.Printf("%02d/%02d : %s\n",
				ind[i][0], ind[i][1], res[i])
		}
	}
}
Насколько это проще чем то же на C/C++ :!:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ make regexg2 
go build -o regexg2 regexg2.go

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ls -l regexg2
-rwxrwxr-x 1 olej olej 2121092 дек 25 03:27 regexg2

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ldd regexg2
    не является динамическим исполняемым файлом

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ file regexg2
regexg2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=A5CwsdQ21MTPb8lByu9w/8i2a9bKVB2l4xHZoM9ig/lVjjVSMLAGftLi63mCJE/QxqWPp6scnWtlfZK0_VU, with debug_info, not stripped
Статическая сборка.

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regexg2 "([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})"
192.168.1.3 принадлежит сети 192.168.1.0
00/11 : 192.168.1.3
44/55 : 192.168.1.0
192.168.1 =>  192.168.1    
no match found

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regexg2 Слово
В начале было Слово, и Слово было у Бога, и Слово было Бог.
25/35 : Слово
40/50 : Слово
76/86 : Слово
Вложения
regexg2.go
(581 байт) 29 скачиваний

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

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

Непрочитанное сообщение Olej » 26 дек 2022, 22:51

Olej писал(а):
24 дек 2022, 21:02
Обновил и сильно дополнил базовую часть, то что касается как-раз C и C++.
Всё что касалось C ещё более менее (хотя косметически ещё пришлось доделать) ... а вот C++ подвергается существенной правке.
Вот так:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ cat regex1++.cc
#include <iostream>
#include <locale>
#include <regex>
using namespace std;

int main(int argc, char *argv[]) {
   locale::global(locale ("ru_RU.utf8"));
   wstring wp = L"строка";
   if (argc > 1) {
      wchar_t warg[strlen(argv[1]) + 1];
      mbstowcs(warg, argv[1], strlen(argv[1]) + 1);
      wp = wstring(warg);
   }
   wregex pattern(wp, regex_constants::icase | regex_constants::awk);
   while (true) {
      wstring buf;
      getline(wcin, buf);
      if (wcin.eof() || buf.empty()) break;
      wcmatch match;                // результат сопоставления
      if (!regex_search((wchar_t*)buf.c_str(), match, pattern)) {
         wcout << "no match found" << endl
               << "--------------------" << endl;
         continue;
      }
      for (unsigned i=0; i<match.size(); ++i) {
         wcout << match.position(i) << L"/" 
               << match.position(i) + match[i].length()
               << L" : " << match[i] << endl;
      }
      wcout << "--------------------" << endl;
   }
}
Весь этот (и дальше) специфический API работает только в C++11 / C++14:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ make
g++ -Wall -std=c++11     regex1++.cc   -o regex1++
Это search, поэтому он ищет только 1-е вхождение, но со всеми включаемыми группами:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regex1++ "([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)"
192.168.1.3
0/11 : 192.168.1.3
0/3 : 192
4/3 : 168
8/1 : 1
10/1 : 3
--------------------
адрес IP: 192.168.1.3
10/11 : 192.168.1.3
10/3 : 192
14/3 : 168
18/1 : 1
20/1 : 3
--------------------

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regex1++ "^([^,]*),([^,]*),([^,]*)"
слово1,слово2,слово3,слово4
0/20 : слово1,слово2,слово3
0/6 : слово1
7/6 : слово2
14/6 : слово3
--------------------
Всё что делается, в этом и следующем, вариантах C++ - делается в широких символах wchar_t, или оно же строки C++ wstring.
Важно!: что приэтом все позиции считаются в символах а не байтех :!:
Вложения
regex1++.cc
(1.01 КБ) 27 скачиваний

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

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

Непрочитанное сообщение Olej » 26 дек 2022, 22:56

Olej писал(а):
26 дек 2022, 22:51
Это search, поэтому он ищет только 1-е вхождение, но со всеми включаемыми группами:
И вариант с итераторами регулярных выражений.
Он ищет (отождествляет) все входения:

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

#include <iostream>
#include <locale>
#include <regex>
using namespace std;

int main(int argc, char *argv[]) {
   locale::global(locale ("ru_RU.utf8"));
   wstring wp = L"строка";
   if(argc > 1) {
      wchar_t warg[strlen(argv[1]) + 1];
      mbstowcs(warg, argv[1], strlen(argv[1]) + 1);
      wp = wstring(warg);
   }
   wregex pattern(wp, regex_constants::icase | regex_constants::awk);
   while (true) {
      wstring buf;
      getline(wcin, buf);
      if (wcin.eof() || buf.empty()) break;
      wsregex_iterator beg = wsregex_iterator(buf.begin(), buf.end(), pattern),
                       end = wsregex_iterator();
      wcout << L"Число сопоставлений " << distance(beg, end) << endl;
      for (auto i = beg; i != end; i++)                   // сопоставление
         for(long unsigned int j = 0; j < i->size(); j++) // группа
            wcout << i->position(j) << L"/" 
                  << i->position(j) + i->length(j)
                  << L" : " << i->str(j) << endl;
      wcout << "--------------------" << endl;
   }
}

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ make
g++ -Wall -std=c++11     regex2++.cc   -o regex2++
Вот это особенно интересно

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regex2++ "([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)"
адрес IP: 192.168.1.3 в сети адрес IP: 192.168.1.0
Число сопоставлений 2
10/11 : 192.168.1.3
10/3 : 192
14/3 : 168
18/1 : 1
20/1 : 3
39/11 : 192.168.1.0
39/3 : 192
43/3 : 168
47/1 : 1
49/1 : 0
--------------------
192.168.1.3
Число сопоставлений 1
0/11 : 192.168.1.3
0/3 : 192
4/3 : 168
8/1 : 1
10/1 : 3
--------------------

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regex2++ Слово
В начале было Слово, и Слово было у Бога, и Слово было Бог.
Число сопоставлений 3
14/5 : Слово
23/5 : Слово
44/5 : Слово
--------------------

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regex2++ Бог
В начале было Слово, и Слово было у Бога, и Слово было Бог
Число сопоставлений 2
36/3 : Бог
55/3 : Бог
--------------------

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regex2++ Бог$
В начале было Слово, и Слово было у Бога, и Слово было Бог
Число сопоставлений 1
55/3 : Бог
--------------------
Вложения
regex2++.cc
(1.06 КБ) 27 скачиваний

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

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

Непрочитанное сообщение Olej » 26 дек 2022, 23:09

Olej писал(а):
25 дек 2022, 16:36
И снова возвращаясь в тему...
Go
Всё что делал этот код Go - недостаточно.
Здесь ищутся все отождествления, но не обрабатываются группы - () регулярных выражениях.
Теперь стало так:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ cat regexg2.go
package main

import (
	"bufio"
	"fmt"
	"os"
	"regexp"
)

func main() {
	pattern := "."
	if len(os.Args) > 1 {
		pattern = os.Args[1]
	}
	re, err := regexp.Compile(pattern)
	if err != nil {
		fmt.Println(err)
		return
	}
	sc := bufio.NewScanner(os.Stdin)
	for sc.Scan() {
		buf := sc.Text()
		if 0 == len(buf) { // выход
			break
		}
		res := re.FindAllSubmatch([]byte(buf), -1)
		if nil == res {
			fmt.Println("no match found\n")
			fmt.Printf("--------------------\n")
			continue
		}
		ind := re.FindAllSubmatchIndex([]byte(buf), -1)
		for i := 0; i < len(res); i++ {
			for j := 0; j < len(res[i]); j++ {
				fmt.Printf("%d/%d : %s\n",
					ind[i][2*j], ind[i][2*j+1],
					res[i][j])
			}
		}
		fmt.Printf("--------------------\n")
	}
}
Этот код в таком виде форматирован самим GoLang под "кодестайл" как он сам его понимает:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ go fmt regexg2.go 
regexg2.go
Сборка:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ make regexg2 
go build -o regexg2 regexg2.go

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ls -l regexg2
-rwxrwxr-x 1 olej olej 2121092 дек 25 03:27 regexg2

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ldd regexg2
    не является динамическим исполняемым файлом

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ file regexg2
regexg2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=A5CwsdQ21MTPb8lByu9w/8i2a9bKVB2l4xHZoM9ig/lVjjVSMLAGftLi63mCJE/QxqWPp6scnWtlfZK0_VU, with debug_info, not stripped
Выполнение:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regexg2 "([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})"
192.168.1.3 принадлежит сети 192.168.1.0
0/11 : 192.168.1.3
0/3 : 192
4/7 : 168
8/9 : 1
10/11 : 3
44/55 : 192.168.1.0
44/47 : 192
48/51 : 168
52/53 : 1
54/55 : 0
--------------------
сеть 192.168.1.0
9/20 : 192.168.1.0
9/12 : 192
13/16 : 168
17/18 : 1
19/20 : 0
--------------------
Вот теперь это то что надо!
И русскоязычные (китайские, арабские ...) строки, мультибайтовые Unicide в кодировке UTF-8:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regexg2 Слово
В начале было Слово, и Слово было у Бога, и Слово было Бог
25/35 : Слово
40/50 : Слово
76/86 : Слово
--------------------
Сравниваем с C++ выше:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ ./regex2++ Слово
В начале было Слово, и Слово было у Бога, и Слово было Бог
Число сопоставлений 3
14/19 : Слово
23/28 : Слово
44/49 : Слово
--------------------
Go в мультибайтовых UTF-8 строках позиции считает в байтах!
C++ примеры с широкими символами wchar_t - позиции считает в символах!
Вложения
regexg2.go
(748 байт) 26 скачиваний

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

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

Непрочитанное сообщение Olej » 26 дек 2022, 23:46

Olej писал(а):
24 дек 2022, 21:02
Оставив в покое новые языки программирования ... временно
Снова Rust ...
Olej писал(а):
19 дек 2022, 02:25
Итого, подтянулись 4 крейта (библиотеки)
C Rusr пришлось сильно попотеть ... даже после того как крейты подтянулись...
В итоге:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ cat ./src/main.rs 
use std::env;
use std::io;
use regex::Regex;

fn main() {
   let arguments: Vec<String> = env::args().collect();
   let pattern = if arguments.len() > 1 {
      arguments[1].clone()
   } else {
      String::from(r"(\d{4})-(\d{2})-(\d{2})")
   };
   loop {
      let mut input = String::new();
      io::stdin().read_line(&mut input).expect("ошибка ввода");
      if 1 == input.len() { break }; // выход
      let buf = &input[0 .. input.len() - 1];
      let re = Regex::new(&pattern).expect("ошибка шаблона");
      if 0 == re.captures_iter(buf).count() {
         println!("no match found");
         println!("--------------------");
         continue;
      }
      for caps in re.captures_iter(buf) {
         for i in 0..caps.len() {
            let cap = caps.get(i).unwrap();
            println!("{}/{} : {}",
                     cap.start(), cap.end(), cap.as_str());
         }
      }
      println!("--------------------");
   }
}
Сборка:

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ cargo clean

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ cargo build
   Compiling memchr v2.5.0
   Compiling regex-syntax v0.6.28
   Compiling aho-corasick v0.7.20
   Compiling regex v1.7.0
   Compiling regexrs1 v0.1.0 (/home/olej/2022/own.BOOKs/Localiz/regex.cod/regexrs1)
    Finished dev [unoptimized + debuginfo] target(s) in 7.45s

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ ls -l ./target/debug/regexrs1
-rwxrwxr-x 2 olej olej 16190232 дек 26 13:23 ./target/debug/regexrs1

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ file ./target/debug/regexrs1
./target/debug/regexrs1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=fabef75d7ed731e030f7e44f935608b8a269b680, for GNU/Linux 3.2.0, with debug_info, not stripped

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ ldd ./target/debug/regexrs1
	linux-vdso.so.1 (0x00007ffc5272b000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fed21078000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fed21055000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fed2104f000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed20e5d000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fed213d6000)

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ ./target/debug/regexrs1 "([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)"
адрес IP: 192.168.1.3 в сети адрес IP: 192.168.1.0
15/26 : 192.168.1.3
15/18 : 192
19/22 : 168
23/24 : 1
25/26 : 3
54/65 : 192.168.1.0
54/57 : 192
58/61 : 168
62/63 : 1
64/65 : 0
--------------------
192.168.1.3
0/11 : 192.168.1.3
0/3 : 192
4/7 : 168
8/9 : 1
10/11 : 3
--------------------
192.168.1
no match found
--------------------

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

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod/regexrs1$ ./target/debug/regexrs1 Слово
В начале было Слово, и Слово было у Бога, и Слово было Бог
25/35 : Слово
40/50 : Слово
76/86 : Слово
--------------------
Как легко видеть - строки UTF-8, и позиционирование в них - в байтах.
Вложения
main.rs
(975 байт) 28 скачиваний

Ответить

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

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

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