{"_id":"@dafengzhen/derivative-matcher","_rev":"3-cec57fa2e2544eb5c348cd9d918672d9","name":"@dafengzhen/derivative-matcher","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@dafengzhen/derivative-matcher","version":"0.1.0","keywords":["brzozowski","complement","derivative","dfa","intersection","lexer","parser","pattern-matching","regex","regular-expression","typescript","union"],"author":{"name":"dafengzhen"},"license":"MIT","_id":"@dafengzhen/derivative-matcher@0.1.0","maintainers":[{"name":"dafengzhen","email":"dafengzhen@aliyun.com"}],"homepage":"https://github.com/dafengzhen/derivative-matcher#readme","bugs":{"url":"https://github.com/dafengzhen/derivative-matcher/issues"},"dist":{"shasum":"3d0b60139239a9843fbc3c0f3ec99923e4829b52","tarball":"https://registry.npmjs.org/@dafengzhen/derivative-matcher/-/derivative-matcher-0.1.0.tgz","fileCount":31,"integrity":"sha512-9bFE/5mlQciptJIyJw8uym8TnFZek6wQDiyQL8SDUFU5JVrqs5I5s2Nj2EJr8rC6MK1dUXGFnAJbIPbGbpKrNg==","signatures":[{"sig":"MEUCIHyullaObgpXD8LmdHcR2CLUFzFU+9f5eOKBqJ7AoXvhAiEA0Wy0jdssjD/FwWsOckhTCBytMZmcDI0BulRtxL2Ks+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1231350},"main":"./dist/cjs/modern/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/esm/modern/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/modern/index.js","default":"./dist/esm/modern/index.js","require":"./dist/cjs/modern/index.js"}},"gitHead":"483b6381d9a594fcad450a5ca5d3a92ddb412d96","scripts":{"fmt":"oxfmt","lint":"oxlint","test":"jest","build":"npm run build:types && npm run build:modern && npm run build:legacy && npm run build:dev","watch":"parcel watch","test:c":"jest src --coverage","prepare":"husky install","lint:fix":"oxlint --fix","lint:fmt":"npm run lint:fix && npm run fmt","build:dev":"parcel build src/index.ts --target modern-esm-dev --target modern-cjs-dev --target legacy-esm-dev --target legacy-cjs-dev","fmt:check":"oxfmt --check","build:types":"tsc -p tsconfig.types.json","build:legacy":"parcel build src/index.ts --target legacy-esm --target legacy-cjs","build:modern":"parcel build src/index.ts --target modern-esm --target modern-cjs"},"targets":{"legacy-cjs":{"distDir":"./dist/cjs/legacy","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"legacy-esm":{"distDir":"./dist/esm/legacy","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true},"modern-cjs":{"distDir":"./dist/cjs/modern","optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"modern-esm":{"distDir":"./dist/esm/modern","optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true},"legacy-cjs-dev":{"distDir":"./dist/cjs/legacy-dev","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"legacy-esm-dev":{"distDir":"./dist/esm/legacy-dev","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true},"modern-cjs-dev":{"distDir":"./dist/cjs/modern-dev","optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"modern-esm-dev":{"distDir":"./dist/esm/modern-dev","optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true}},"_npmUser":{"name":"dafengzhen","email":"dafengzhen@aliyun.com"},"repository":{"url":"git+https://github.com/dafengzhen/derivative-matcher.git","type":"git"},"_npmVersion":"11.6.2","description":"A string pattern matching DSL engine for TypeScript, powered by Brzozowski derivatives.","directories":{},"lint-staged":{"*":"npm run fmt --no-error-on-unmatched-pattern","*.{js,jsx,ts,tsx,mjs,cjs}":"npm run lint"},"_nodeVersion":"24.11.1","dependencies":{"@swc/helpers":"^0.5.21","browserslist-config-baseline":"^0.5.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","oxfmt":"^0.49.0","oxlint":"^1.64.0","parcel":"^2.16.4","ts-node":"^10.9.2","babel-jest":"^30.4.1","typescript":"^6.0.3","@babel/core":"^7.29.0","@types/node":"^25.8.0","@jest/globals":"^30.4.1","@commitlint/cli":"^21.0.1","@babel/preset-env":"^7.29.5","@parcel/packager-ts":"^2.16.4","@commitlint/prompt-cli":"^21.0.1","jest-environment-jsdom":"^30.4.1","@babel/preset-typescript":"^7.28.5","@commitlint/config-conventional":"^21.0.1","@parcel/transformer-typescript-types":"^2.16.4"},"_npmOperationalInternal":{"tmp":"tmp/derivative-matcher_0.1.0_1778785380333_0.4246567609302563","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dafengzhen/derivative-matcher","version":"0.1.1","keywords":["brzozowski","complement","derivative","dfa","intersection","lexer","parser","pattern-matching","regex","regular-expression","typescript","union"],"author":{"name":"dafengzhen"},"license":"MIT","_id":"@dafengzhen/derivative-matcher@0.1.1","maintainers":[{"name":"dafengzhen","email":"dafengzhen@aliyun.com"}],"homepage":"https://github.com/dafengzhen/derivative-matcher#readme","bugs":{"url":"https://github.com/dafengzhen/derivative-matcher/issues"},"dist":{"shasum":"b9aea2358b68246bec650206d5bf6600830603f0","tarball":"https://registry.npmjs.org/@dafengzhen/derivative-matcher/-/derivative-matcher-0.1.1.tgz","fileCount":31,"integrity":"sha512-EKjVMHzW4V6VtJcspCl5wJqk5SaiX5eY4ksQ6ajHUzyQtT2AzkHCm5bH3oHyzYPJT+YpRJJtNiRqOnxW5VUY7g==","signatures":[{"sig":"MEQCIAxIjEegv69aEBmIMQEnHQ/hsWPitsbhQBy6e47IIpQtAiBzn4Cfr2wy8wkYMQoxc+RtvnWo0cWUviZ7DAE3aU45VA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2301782},"main":"./dist/cjs/modern/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/esm/modern/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/modern/index.js","default":"./dist/esm/modern/index.js","require":"./dist/cjs/modern/index.js"}},"gitHead":"483b6381d9a594fcad450a5ca5d3a92ddb412d96","scripts":{"fmt":"oxfmt","lint":"oxlint","test":"jest","build":"npm run build:types && npm run build:modern && npm run build:legacy && npm run build:dev","watch":"parcel watch","test:c":"jest src --coverage","prepare":"husky install","lint:fix":"oxlint --fix","lint:fmt":"npm run lint:fix && npm run fmt","build:dev":"parcel build src/index.ts --target modern-esm-dev --target modern-cjs-dev --target legacy-esm-dev --target legacy-cjs-dev","fmt:check":"oxfmt --check","build:types":"tsc -p tsconfig.types.json","build:legacy":"parcel build src/index.ts --target legacy-esm --target legacy-cjs","build:modern":"parcel build src/index.ts --target modern-esm --target modern-cjs"},"targets":{"legacy-cjs":{"distDir":"./dist/cjs/legacy","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"legacy-esm":{"distDir":"./dist/esm/legacy","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true},"modern-cjs":{"distDir":"./dist/cjs/modern","optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"modern-esm":{"distDir":"./dist/esm/modern","optimize":true,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true},"legacy-cjs-dev":{"distDir":"./dist/cjs/legacy-dev","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"legacy-esm-dev":{"distDir":"./dist/esm/legacy-dev","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true},"modern-cjs-dev":{"distDir":"./dist/cjs/modern-dev","optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"commonjs","includeNodeModules":true},"modern-esm-dev":{"distDir":"./dist/esm/modern-dev","optimize":false,"isLibrary":true,"sourceMap":true,"outputFormat":"esmodule","includeNodeModules":true}},"_npmUser":{"name":"dafengzhen","email":"dafengzhen@aliyun.com"},"repository":{"url":"git+https://github.com/dafengzhen/derivative-matcher.git","type":"git"},"_npmVersion":"11.6.2","description":"A string pattern matching DSL engine for TypeScript, powered by Brzozowski derivatives.","directories":{},"lint-staged":{"*":"npm run fmt --no-error-on-unmatched-pattern","*.{js,jsx,ts,tsx,mjs,cjs}":"npm run lint"},"_nodeVersion":"24.11.1","dependencies":{"@swc/helpers":"^0.5.21","browserslist-config-baseline":"^0.5.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","oxfmt":"^0.51.0","oxlint":"^1.66.0","parcel":"^2.16.4","ts-node":"^10.9.2","babel-jest":"^30.4.1","typescript":"^6.0.3","@babel/core":"^7.29.0","@types/node":"^25.9.1","@jest/globals":"^30.4.1","@commitlint/cli":"^21.0.1","@babel/preset-env":"^7.29.5","@parcel/packager-ts":"^2.16.4","@commitlint/prompt-cli":"^21.0.1","jest-environment-jsdom":"^30.4.1","@babel/preset-typescript":"^7.28.5","@commitlint/config-conventional":"^21.0.1","@parcel/transformer-typescript-types":"^2.16.4"},"_npmOperationalInternal":{"tmp":"tmp/derivative-matcher_0.1.1_1779378848604_0.9172642098965651","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dafengzhen/derivative-matcher","version":"0.1.2","description":"A string pattern matching DSL engine for TypeScript, powered by Brzozowski derivatives.","keywords":["brzozowski","complement","derivative","dfa","intersection","lexer","parser","pattern-matching","regex","regular-expression","typescript","union"],"homepage":"https://github.com/dafengzhen/derivative-matcher#readme","bugs":{"url":"https://github.com/dafengzhen/derivative-matcher/issues"},"license":"MIT","author":{"name":"dafengzhen"},"repository":{"type":"git","url":"git+https://github.com/dafengzhen/derivative-matcher.git"},"type":"module","main":"./dist/cjs/modern/index.js","module":"./dist/esm/modern/index.js","types":"./dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/modern/index.js","require":"./dist/cjs/modern/index.js","default":"./dist/esm/modern/index.js"}},"scripts":{"build:types":"tsc -p tsconfig.types.json","build:modern":"parcel build src/index.ts --target modern-esm --target modern-cjs","build:legacy":"parcel build src/index.ts --target legacy-esm --target legacy-cjs","build:dev":"parcel build src/index.ts --target modern-esm-dev --target modern-cjs-dev --target legacy-esm-dev --target legacy-cjs-dev","build":"npm run build:types && npm run build:modern && npm run build:legacy && npm run build:dev","prepare":"husky install","test":"jest","test:c":"jest src --coverage","watch":"parcel watch","fmt":"oxfmt","lint":"oxlint --fix","lint:fmt":"run-s lint fmt"},"dependencies":{"@swc/helpers":"^0.5.23","browserslist-config-baseline":"^0.5.0"},"devDependencies":{"@babel/core":"^8.0.1","@babel/preset-env":"^8.0.2","@babel/preset-typescript":"^8.0.1","@commitlint/cli":"^21.2.1","@commitlint/config-conventional":"^21.2.0","@commitlint/prompt-cli":"^21.2.0","@jest/globals":"^30.4.1","@parcel/packager-ts":"^2.16.4","@parcel/transformer-typescript-types":"^2.16.4","@types/node":"^26.1.2","babel-jest":"^30.4.1","eslint-plugin-perfectionist":"^5.10.0","husky":"^9.1.7","jest":"^30.4.2","jest-environment-jsdom":"^30.4.1","npm-run-all2":"^9.0.3","oxfmt":"^0.61.0","oxlint":"^1.76.0","parcel":"^2.16.4","ts-node":"^10.9.2","typescript":"^6.0.3"},"lint-staged":{"*.{js,jsx,ts,tsx,mjs,cjs}":"npm run lint","*":"npm run fmt --no-error-on-unmatched-pattern"},"allowScripts":{"lmdb@2.8.5":true,"@parcel/watcher@2.6.0":true,"@swc/core@1.15.47":true,"unrs-resolver@1.12.2":true,"msgpackr-extract@3.0.4":true},"targets":{"legacy-cjs":{"distDir":"./dist/cjs/legacy","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"includeNodeModules":true,"isLibrary":true,"optimize":true,"outputFormat":"commonjs","sourceMap":true},"legacy-cjs-dev":{"distDir":"./dist/cjs/legacy-dev","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"includeNodeModules":true,"isLibrary":true,"optimize":false,"outputFormat":"commonjs","sourceMap":true},"legacy-esm":{"distDir":"./dist/esm/legacy","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"includeNodeModules":true,"isLibrary":true,"optimize":true,"outputFormat":"esmodule","sourceMap":true},"legacy-esm-dev":{"distDir":"./dist/esm/legacy-dev","engines":{"browsers":">0.3%, Chrome >= 87, ChromeAndroid >= 87, Edge >= 87, Firefox >= 83, FirefoxAndroid >= 83, Safari >= 14, iOS >= 14"},"includeNodeModules":true,"isLibrary":true,"optimize":false,"outputFormat":"esmodule","sourceMap":true},"modern-cjs":{"distDir":"./dist/cjs/modern","includeNodeModules":true,"isLibrary":true,"optimize":true,"outputFormat":"commonjs","sourceMap":true},"modern-cjs-dev":{"distDir":"./dist/cjs/modern-dev","includeNodeModules":true,"isLibrary":true,"optimize":false,"outputFormat":"commonjs","sourceMap":true},"modern-esm":{"distDir":"./dist/esm/modern","includeNodeModules":true,"isLibrary":true,"optimize":true,"outputFormat":"esmodule","sourceMap":true},"modern-esm-dev":{"distDir":"./dist/esm/modern-dev","includeNodeModules":true,"isLibrary":true,"optimize":false,"outputFormat":"esmodule","sourceMap":true}},"gitHead":"01853ed91eb97263a14ec86050749c6f01433066","_id":"@dafengzhen/derivative-matcher@0.1.2","_nodeVersion":"26.5.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-wVERGuIF/JNs/78O5x3gmWwHFLUlr0DvBeMyxJH4qjfmd1dGRxtmeIKf+cP2RNB1628dBCTtuLkLjRsmq/X4lA==","shasum":"8e3efdafc4aeb97166cb47ab921ae20ba0d102ab","tarball":"https://registry.npmjs.org/@dafengzhen/derivative-matcher/-/derivative-matcher-0.1.2.tgz","fileCount":31,"unpackedSize":2345867,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDyXvrivsYq3dLbsXplGZzoCekbkNGnkzqj3APxFbRYmwIgIwMpGbPvfYC4PMhWbpTL3hwdSTj9ZYX6sxZuX6UFKqo="}]},"_npmUser":{"name":"dafengzhen","email":"dafengzhen@aliyun.com"},"directories":{},"maintainers":[{"name":"dafengzhen","email":"dafengzhen@aliyun.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/derivative-matcher_0.1.2_1785657969377_0.9982635376306721"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-14T19:03:00.208Z","modified":"2026-08-02T08:06:09.676Z","0.1.0":"2026-05-14T19:03:00.560Z","0.1.1":"2026-05-21T15:54:08.862Z","0.1.2":"2026-08-02T08:06:09.541Z"},"bugs":{"url":"https://github.com/dafengzhen/derivative-matcher/issues"},"author":{"name":"dafengzhen"},"license":"MIT","homepage":"https://github.com/dafengzhen/derivative-matcher#readme","keywords":["brzozowski","complement","derivative","dfa","intersection","lexer","parser","pattern-matching","regex","regular-expression","typescript","union"],"repository":{"type":"git","url":"git+https://github.com/dafengzhen/derivative-matcher.git"},"description":"A string pattern matching DSL engine for TypeScript, powered by Brzozowski derivatives.","maintainers":[{"name":"dafengzhen","email":"dafengzhen@aliyun.com"}],"readme":"# derivative-matcher\n\n[![GitHub License](https://img.shields.io/github/license/dafengzhen/derivative-matcher?color=blue)](https://github.com/dafengzhen/derivative-matcher)\n[![NPM Version](https://img.shields.io/npm/v/@dafengzhen/derivative-matcher)](https://www.npmjs.com/package/@dafengzhen/derivative-matcher)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/dafengzhen/derivative-matcher/pulls)\n\n[English](./README.md)\n\n一个基于 [Brzozowski 导数](https://en.wikipedia.org/wiki/Brzozowski_derivative) 的 TypeScript 字符串模式匹配 DSL 引擎。\n\n与标准正则表达式不同，该引擎支持**布尔运算**——交集（`&`）、并集（`|`）和补集（`!`）——让你在有限字母表上获得正则语言的全部表达能力。\n\n## 特性\n\n- **正则表达式的布尔代数**——使用 `&`（交集）、`|`（并集）和 `!`（补集）组合模式\n- **基于 Brzozowski 导数的 DFA 构建**——无回溯，性能可预测\n- **快速路径优化**——为常见模式提供字面量匹配器、字面量集合匹配器和字符查找表匹配器\n- **锚点匹配**——支持 `^` 和 `$` 实现全字符串匹配\n- **LRU 编译器缓存**——编译后的匹配器会被缓存以供重复使用\n- **TypeScript 优先**——完全类型化的 API，导出类型定义\n\n## 安装\n\n```bash\nnpm install @dafengzhen/derivative-matcher\n```\n\n## 快速开始\n\n```typescript\nimport { createPatternMatcher, testPattern } from '@dafengzhen/derivative-matcher';\n\n// 编译一次，多次测试\nconst matcher = createPatternMatcher('(cat|dog)s?');\nmatcher.test('cat'); // true\nmatcher.test('dogs'); // true\nmatcher.test('bird'); // false\n\n// 一次性测试\ntestPattern('\\\\d+', '12345'); // true\ntestPattern('\\\\d+', 'abc'); // false\n```\n\n## DSL 语法\n\n### 字面量 & 通配符\n\n| 语法  | 描述               | 示例             |\n| ----- | ------------------ | ---------------- |\n| `abc` | 字面量字符串       | `abc` 匹配 `abc` |\n| `.`   | 任意单个字符       | `a.c` 匹配 `abc` |\n| `\\n`  | 换行符（转义）     |                  |\n| `\\r`  | 回车符（转义）     |                  |\n| `\\t`  | 制表符（转义）     |                  |\n| `\\ `  | 转义空格（字面量） |                  |\n\n### 字符类\n\n| 语法     | 描述                    | 示例                         |\n| -------- | ----------------------- | ---------------------------- |\n| `[abc]`  | 字符集                  | `[abc]` 匹配 `a`、`b` 或 `c` |\n| `[a-z]`  | 字符范围                | `[a-z]` 匹配小写字母         |\n| `[^abc]` | 否定字符集              | `[^0-9]` 匹配任意非数字字符  |\n| `[^]`    | 否定空集 = 任意字符     | `[^]` 匹配任意单个字符       |\n| `\\d`     | 数字 `[0-9]`            | `\\d\\d` 匹配 `42`             |\n| `\\D`     | 非数字                  | `\\D+` 匹配 `abc`             |\n| `\\w`     | 单词字符 `[a-zA-Z0-9_]` |                              |\n| `\\W`     | 非单词字符              |                              |\n| `\\s`     | 空白字符                |                              |\n| `\\S`     | 非空白字符              |                              |\n\n### 量词\n\n| 语法     | 描述          | 示例                              |\n| -------- | ------------- | --------------------------------- |\n| `E*`     | 零次或多次    | `a*b` 匹配 `b`、`ab`、`aaab`      |\n| `E+`     | 一次或多次    | `a+b` 匹配 `ab`、`aaab`           |\n| `E?`     | 零次或一次    | `colou?r` 匹配 `color`、`colour`  |\n| `E{n}`   | 恰好 n 次     | `a{3}` 匹配 `aaa`                 |\n| `E{n,m}` | n 到 m 次之间 | `a{2,4}` 匹配 `aa`、`aaa`、`aaaa` |\n| `E{n,}`  | 至少 n 次     | `a{5,}` 匹配 5 个及以上的 `a`     |\n\n### 布尔运算\n\n这是本 DSL 区别于标准正则引擎的**独特功能**：\n\n| 语法      | 描述         | 示例                                 |\n| --------- | ------------ | ------------------------------------ |\n| `E1\\|E2`  | 并集（选择） | `cat\\|dog` 匹配 `cat` 或 `dog`       |\n| `E1 & E2` | 交集         | `[a-z] & [aeiou]` 仅匹配小写元音字母 |\n| `!E`      | 补集（取反） | `![0-9]` 匹配任意非数字字符          |\n\n```typescript\n// 交集：仅匹配偶数数字\nconst evenDigits = createPatternMatcher('[0-9] & [02468]');\nevenDigits.test('2'); // true\nevenDigits.test('3'); // false\n\n// 补集：匹配除数字外的任意字符\nconst nonDigits = createPatternMatcher('![0-9]');\nnonDigits.test('a'); // true\nnonDigits.test('5'); // false\n\n// 双重补集互相抵消\nconst matcher = createPatternMatcher('!!a');\nmatcher.test('a'); // true\nmatcher.test('b'); // false\n```\n\n### 锚点\n\n| 语法 | 描述     | 示例                                 |\n| ---- | -------- | ------------------------------------ |\n| `^`  | 输入开头 | `^hello` 匹配以 `hello` 开头的字符串 |\n| `$`  | 输入结尾 | `world$` 匹配以 `world` 结尾的字符串 |\n\n```typescript\nconst matcher = createPatternMatcher('^hello$');\nmatcher.test('hello'); // true\nmatcher.test('hello world'); // false\nmatcher.test('say hello'); // false\n```\n\n### 分组\n\n使用括号控制优先级：\n\n```typescript\n// 不使用分组：a 然后 (b 或 c)\nconst m1 = createPatternMatcher('a(b|c)');\nm1.test('ab'); // true\nm1.test('ac'); // true\n\n// 空分组匹配空字符串\nconst m2 = createPatternMatcher('()');\nm2.test(''); // true\nm2.test('a'); // false\n```\n\n## API 参考\n\n### `createPatternMatcher(pattern: string): PatternMatcher`\n\n将模式字符串编译为 `PatternMatcher` 实例。编译流程为：词法分析 → 语法解析 → 优化 → DFA 构建。结果按模式字符串缓存，采用 LRU 淘汰策略（最多 128 条）。\n\n```typescript\nconst matcher = createPatternMatcher('\\\\d{3}-\\\\d{4}');\nmatcher.test('123-4567'); // true\n```\n\n### `testPattern(pattern: string, input: string): boolean`\n\n便捷函数，编译模式并立即对输入字符串进行测试。\n\n```typescript\ntestPattern('\\\\w+@\\\\w+\\\\.\\\\w+', 'user@example.com'); // true\n```\n\n### `clearPatternMatcherCache(): void`\n\n清空已编译模式匹配器的内部缓存。适用于释放内存或在测试中重置状态。\n\n```typescript\nclearPatternMatcherCache();\n```\n\n### `PatternMatcher`\n\n`createPatternMatcher` 返回的类，主要方法：\n\n- **`test(input: string): boolean`** —— 测试输入字符串是否匹配该模式。\n\n## 工作原理\n\n引擎使用 **Brzozowski 导数**——一种形式语言理论技术，通过计算表达式相对于每个字符的_导数_来消耗输入。结果是一个新的表达式，表示\"剩余需要匹配的内容\"。\n\n### 流水线\n\n```\n模式字符串\n    │\n    ▼\n词法分析器 (PatternLexer)       → Token 流\n    │\n    ▼\n语法解析器 (PatternParser)      → AST（PatternExpression）\n    │\n    ▼\n优化器                          → 字面量/字符表快速路径\n    │\n    ▼\n自动机构建器 (AutomatonBuilder) → DFA（DeterministicAutomaton）\n    │\n    ▼\n模式匹配器 (PatternMatcher)     → test(input) → boolean\n```\n\n### 优化策略\n\n编译器应用多层优化：\n\n1. **有限字面量集合提取**——如果模式表示一个小的、有限的语言（如 `cat|dog|bird`），使用基于 `Set` 的匹配器实现 O(1) 查找\n2. **单字符检测**——如果模式恰好匹配一个字符（如 `.`、`\\d`、`[abc]`），使用 256 元素的查找表\n3. **DFA 回退**——对于复杂模式，构建带有完整状态转移表的完整 DFA 以实现高效匹配\n\n### 代数化简\n\n编译器在 DFA 构建之前应用代数定律来简化表达式：\n\n- **德摩根定律**：`!(A | B)` → `!A & !B`，`!(A & B)` → `!A | !B`\n- **双重补集**：`!!E` → `E`\n- **互补对检测**：`E | !E` → 任意字符串，`E & !E` → 永不匹配\n- **恒等化简**：`E | ∅` → `E`，`E & Σ*` → `E`，`E · ε` → `E`\n\n## License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.zh.md"}