#sqlite-extension #sqlite #regex #regular #pattern #capture

sqlite-regex

用于处理正则表达式的 SQLite 扩展

6 个版本

0.2.4-alpha.12023年10月7日
0.2.3 2023年7月24日
0.2.3-alpha.92023年6月10日

#466 in 数据库接口

MIT/Apache

75KB
1.5K SLoC

Rust 1K SLoC // 0.0% comments Python 138 SLoC // 0.1% comments JavaScript 120 SLoC Shell 80 SLoC // 0.2% comments TypeScript 59 SLoC // 0.2% comments SQL 42 SLoC Ruby 13 SLoC

sqlite-regex

一个快速高效的 SQLite 正则表达式扩展。基于 sqlite-loadable-rsregex crate

详见 介绍 sqlite-regex:SQLite 最快的正则表达式扩展(2023年1月)了解更多细节!

如果你的公司或组织发现这个库很有用,请考虑 支持我的工作

使用方法

.load ./regex0
select 'foo' regexp 'f';

在字符串中查找所有模式出现的实例

select regex_find(
  '[0-9]{3}-[0-9]{3}-[0-9]{4}',
  'phone: 111-222-3333'
);
-- '111-222-3333'

select rowid, *
from regex_find_all(
  '\b\w{13}\b',
  'Retroactively relinquishing remunerations is reprehensible.'
);
/*
┌───────┬───────┬─────┬───────────────┐
│ rowid │ start │ end │     match     │
├───────┼───────┼─────┼───────────────┤
│ 0     │ 0     │ 13  │ Retroactively │
│ 1     │ 14    │ 27  │ relinquishing │
│ 2     │ 28    │ 41  │ remunerations │
│ 3     │ 45    │ 58  │ reprehensible │
└───────┴───────┴─────┴───────────────┘
*/

通过索引或名称提取捕获组值

select
  regex_capture(captures, 0)        as entire_match,
  regex_capture(captures, 'title')  as title,
  regex_capture(captures, 'year')   as year
from regex_captures(
  regex("'(?P<title>[^']+)'\s+\((?P<year>\d{4})\)"),
  "'Citizen Kane' (1941), 'The Wizard of Oz' (1939), 'M' (1931)."
);
/*
┌───────────────────────────┬──────────────────┬──────┐
│       entire_match        │      title       │ year │
├───────────────────────────┼──────────────────┼──────┤
│ 'Citizen Kane' (1941)     │ Citizen Kane     │ 1941 │
│ 'The Wizard of Oz' (1939) │ The Wizard of Oz │ 1939 │
│ 'M' (1931)                │ M                │ 1931 │
└───────────────────────────┴──────────────────┴──────┘
*/

使用 RegexSets 在线性时间内匹配字符串上的多个模式

select regexset_is_match(
  regexset(
    "bar",
    "foo",
    "barfoo"
  ),
  'foobar'
)

根据给定的模式分隔符拆分字符串

select rowid, *
from regex_split('[ \t]+', 'a b     c d    e');
/*
┌───────┬──────┐
│ rowid │ item │
├───────┼──────┤
│ 0     │ a    │
│ 1     │ b    │
│ 2     │ c    │
│ 3     │ d    │
│ 4     │ e    │
└───────┴──────┘
*/

将模式出现的实例替换为另一个字符串

select regex_replace(
  '(?P<last>[^,\s]+),\s+(?P<first>\S+)',
  'Springsteen, Bruce',
  '$first $last'
);
-- 'Bruce Springsteen'

select regex_replace_all('a', 'abc abc', '');
-- 'bc bc'

文档

详见 docs.md 以获取完整的 API 参考。

安装

语言 安装
Python pip install sqlite-regex PyPI
Datasette datasette install datasette-sqlite-regex Datasette
Node.js npm install sqlite-regex npm
Deno deno.land/x/sqlite_regex deno.land/x release
Ruby gem install sqlite-regex Gem
Github 发布版 GitHub tag (latest SemVer pre-release)
Rust cargoadd sqlite-regex Crates.io

发布页面 中包含适用于 Linux x86_64、MacOS 和 Windows 的预构建二进制文件。

作为可加载扩展

如果您想将 sqlite-regex 作为 运行时加载扩展 使用,请从发布版下载 regex0.dylib(MacOS)、regex0.so(Linux)或 regex0.dll(Windows)文件,并将其加载到您的 SQLite 环境中。

注意: 文件名中的 0regex0.dylib / regex0.so / regex0.dll)表示 sqlite-regex 的大版本号。目前 sqlite-regex 预 v1,因此未来版本可能存在不兼容的变更。

例如,如果您使用的是 SQLite CLI,您可以像这样加载库

.load ./regex0
select regex_version();
-- v0.1.0

或者,在 Python 中使用内置的 sqlite3 模块

import sqlite3
con = sqlite3.connect(":memory:")
con.enable_load_extension(True)
con.load_extension("./regex0")
print(con.execute("select regex_version()").fetchone())
# ('v0.1.0',)

或者在 Node.js 中使用 better-sqlite3

const Database = require("better-sqlite3");
const db = new Database(":memory:");
db.loadExtension("./regex0");
console.log(db.prepare("select regex_version()").get());
// { 'regex_version()': 'v0.1.0' }

或者使用 Datasette

datasette data.db --load-extension ./regex0

支持

我(Alex 👋🏼)在这个项目上投入了大量的时间和精力,以及 许多其他开源项目。如果你的公司或组织使用这个库(或者你感到慷慨),那么请考虑 支持我的工作,或者与朋友分享这个项目!

另请参阅

  • sqlite-xsv,一个用于处理 CSV 的 SQLite 扩展
  • sqlite-loadable,一个用于编写 Rust SQLite 扩展的框架
  • sqlite-http,一个用于发送 HTTP 请求的 SQLite 扩展

依赖项

约 15MB
约 286K SLoC