正则表达式引擎/风味对比
2020年9月16日11:30:10
转自:https://deerchao.cn/tutorials/regex/diffs.html
正则表达式引擎/风味说明
风味是规范,引擎是实现。
名称 | 说明 | 应用 |
---|---|---|
.NET | 由 System.Text.RegularExpressions 相关类 提供的正则引擎。 |
基于 .Net 的语言和软件。如 C#, Visual Basic.Net, F#, Powershell, Delphi for .NET 等。 |
Java | 由 java.util.regex 包提供, 在 Java 4 (JDK 1.4.x) 及更新的版本中可用。在 Java 5 (JDK 1.5.x) 和 6 (JDK 1.6.x) 中添加了一些新功能。 |
基于 JVM 的语言和软件,如 Java, Clojure 等。 |
Perl | 内置于 Perl 的正则表达式引擎,5.6 之前的版本不支持 Unicode。 | Perl 编程语言。 |
PCRE | 来自开源项目 PCRE的正则表达式引擎。 本文介绍的功能在 PCRE 5.x 和 6.x 中可用。 | REALbasic(Xojo) 语言; Delphi 组件 TPerlRegEx 和 Delphi XE 和 C++Builder XE 的单元 RegularExrpessions 和 RegularExpressionsCore ; PHP 的 preg 函数; R 语言(perl = true ); COM 对象 Microsoft VBScript Regular Expressions 5.5。 |
JS(JavaScript) | 由 ECMA-262 标准第 3 版定义的脚本语言(ECMAScript)中的正则表达式语法。 | JavaScript 编程语言;VBScript 中的 RegExp ;ClojureScript 编程语言。 |
Python | 由 Python 内置模块 re 支持。 |
Python 编程语言。 |
Ruby | 由 Ruby 内置的正则表达式引擎。 | Ruby 编程语言。 |
Tcl ARE | 由 Henry Spencer 为 Tcl 8.2/8.4 中命令 regexp 开发,被称为高级正则表达式(Advanced Regular Expressions, ARE)。 |
Tcl 编程语言;PostgreSQL 7.4 及更新版本;wxWidgets(wxRE_ADVANCED )。 |
POSIX BRE | 由 IEEE POSIX 标准 1003 定义的基本正则表达式(Basic Regular Expressions)。 | Unix 上的软件工具;R 语言(perl = false, extended = false );Tcl的 基本风味(Extended Regular Expressions),wxWidgets(wxRE_BASIC )。 |
POSIX ERE | 由 IEEE POSIX 标准 1003 定义的扩展正则表达式(Extended Regular Expressions)。 | Unix 上的软件工具,如 awk, grep, egrep, emacs 等(Emacs 不支持 POSIX 字符类, 排序序列和等值字符); MySQL, Oracle 数据库( Oracle 支持标准外的后向引用,从 \1 到 \9 ),PostgreSQL 7.3 及更早版本; PHP 的 ereg 函数,R 语言默认状态,Tcl 的扩展风味(Extended Regular Expressions),wxWidgets(wxRE_EXTENDED )。 |
GNU BRE | GNU 基本正则表达式(GNU Basic Regular Expressions), 包含 POSIX BRE 及 GNU 扩展。 | GNU 实现的经典 UNIX 工具,如 GNU/Linux 上的 sed 等。 |
GNU ERE | GNU 扩展正则表达式(Extended Regular Expressions), 包含 POSIX ERE 及 GNU 扩展。 | GNU 实现的经典 UNIX 工具,如 GNU/Linux 上的 egrep, grep 等。 |
XML | 由 XML Schema 标准的附录 G定义。 | XML Schema。 |
XPath | 由 XQuery 1.0 和 XPath 2.0 标准中的函数与运算符章节定义。 | XQuery, XPath。 |
JGsoft | 由 Just Great Software 产品使用的正则表达式引擎。 | PowerGREP, EditPad Pro, AceText, RegexBuddy 等。 |
正则表达式引擎/风味特性对比表
字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\ 转义单个元字符 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES |
\Q...\E 转义多个元字符 |
YES | no | Java 6 | YES | YES | no | no | no | no | no | no | no | no | no | no |
\x00 ~ \xFF (ASCII 字符) |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | no | no |
\n (换行), \r (回车), \t (制表) |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | YES | YES |
\f (换页), \v (竖直制表) |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | no | no |
\a (响铃) |
YES | YES | YES | YES | YES | no | YES | YES | YES | no | no | no | no | no | no |
\e (转义) |
YES | YES | YES | YES | YES | no | no | YES | YES | no | no | no | no | no | no |
\b (退格), \B (反斜杠, \ ) |
no | no | no | no | no | no | no | no | YES | no | no | no | no | no | no |
\cA ~ \cZ (控制字符) |
YES | YES | YES | YES | YES | YES | no | no | YES | no | no | no | no | no | no |
\ca ~ \cz (控制字符) |
YES | YES | no | YES | YES | YES | no | no | YES | no | no | no | no | no | no |
字符类/字符集 [abc] | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
[abc] 字符类 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES |
[^abc] 反义字符类 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES |
[a-z] 字符类范围 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES |
[\d-z] 中的 - 视为字面量 |
YES | YES | YES | YES | YES | no | no | no | no | no | no | no | no | no | no |
[a-\d] 中的 - 视为字面量 |
YES | no | no | no | YES | no | no | no | no | no | no | no | no | no | no |
\ 转义单个字符类元字符 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | YES | YES |
\Q...\E 转义多个字符类元字符 |
YES | no | Java 6 | YES | YES | no | no | no | no | no | no | no | no | no | no |
\d 代表数字 |
YES | YES | ascii | YES | ascii | ascii | option | ascii | YES | no | no | no | no | YES | YES |
\w 代表单词字符 |
YES | YES | ascii | YES | ascii | ascii | option | ascii | YES | no | no | YES | YES | YES | YES |
\s 代表空白字符 |
YES | YES | ascii | YES | ascii | YES | option | ascii | YES | no | no | YES | YES | ascii | ascii |
\D , \W and \S 代表反义字符类 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | YES | YES | YES | YES |
[\b] 匹配反斜杠(\ ) |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | no | no |
点 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
. 匹配换行符(\n )外所有字符 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES |
锚点 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
^ 字符串/行开始 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | no | YES |
$ 字符串/行结束 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | no | YES |
\A 字符串开始 |
YES | YES | YES | YES | YES | no | YES | YES | YES | no | no | no | no | no | no |
\Z 字符串结束,最后一个\n前 |
YES | YES | YES | YES | YES | no | no | YES | YES | no | no | no | no | no | no |
\z 字符串结束 |
YES | YES | YES | YES | YES | no | \Z |
YES | no | no | no | no | no | no | no |
\` 字符串开始 |
no | no | no | no | no | no | no | no | no | no | no | YES | YES | no | no |
\' 字符串结束 |
no | no | no | no | no | no | no | no | no | no | no | YES | YES | no | no |
单词边界 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\b 单词的开始或结束处 |
YES | YES | YES | YES | ascii | ascii | option | ascii | no | no | no | YES | YES | no | no |
\B 不是单词的开始处或结束处 |
YES | YES | YES | YES | ascii | ascii | option | ascii | no | no | no | YES | YES | no | no |
\y 单词的开始或结束处 |
YES | no | no | no | no | no | no | no | YES | no | no | no | no | no | no |
\Y 不是单词的开始处或结束处 |
YES | no | no | no | no | no | no | no | YES | no | no | no | no | no | no |
\m 单词的开始处 |
YES | no | no | no | no | no | no | no | YES | no | no | no | no | no | no |
\M 单词的结束处 |
YES | no | no | no | no | no | no | no | YES | no | no | no | no | no | no |
\< 单词的开始处 |
no | no | no | no | no | no | no | no | no | no | no | YES | YES | no | no |
\> 单词的结束处 |
no | no | no | no | no | no | no | no | no | no | no | YES | YES | no | no |
分支条件 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
| 分支条件 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | YES | \| | YES | YES | YES |
量词 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
? 0 ~ 1 次 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | YES | \? | YES | YES | YES |
* 0 次或更多次 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | YES |
+ 1 次或更多次 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | YES | \+ | YES | YES | YES |
{n} n 次 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | \{n\} | YES | \{n\} | YES | YES | YES |
{n,m} n ~ m 次 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | \{n,m\} | YES | \{n,m\} | YES | YES | YES |
{n,} n 次或更多次 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | \{n,\} | YES | \{n,\} | YES | YES | YES |
量词后加 ? 转为懒惰模式 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | no | YES |
分组与后向引用 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(regex) 编号捕获组 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | \( \) | YES | \( \) | YES | YES | YES |
(?:regex) 非捕获组 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | no | no |
\1 ~ \9 后向引用 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | YES | no | YES | YES | no | YES |
\10 ~ \99 后向引用 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | n/a | no | no | n/a | YES |
前向引用 \1 through \9 |
YES | YES | YES | YES | YES | no | no | YES | no | no | n/a | no | no | n/a | no |
嵌套引用 \1 ~ \9 |
YES | YES | YES | YES | YES | YES | no | YES | no | no | n/a | no | no | n/a | no |
后向引用不存在的组报错 | YES | YES | YES | YES | YES | no | YES | no | YES | YES | n/a | YES | YES | n/a | YES |
后向引用匹配失败的组失败 | YES | YES | YES | YES | YES | no | YES | YES | YES | YES | n/a | YES | YES | n/a | YES |
修饰器 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?i) 忽略大小写 |
YES | YES | YES | YES | YES | /i only | YES | YES | YES | no | no | no | no | no | flag |
(?s) 点(. )可匹配\n |
YES | YES | YES | YES | YES | no | YES | (?m) | no | no | no | no | no | no | flag |
(?m) 行开始/结束可匹配 ^ / $ |
YES | YES | YES | YES | YES | /m only | YES | always on | no | no | no | no | no | no | flag |
(?x) 忽略空白模式 |
YES | YES | YES | YES | YES | no | YES | YES | YES | no | no | no | no | no | flag |
(?n) 显式匹配 |
YES | YES | no | no | no | no | no | no | no | no | no | no | no | no | no |
(?-ismxn) 关闭模式修饰器 |
YES | YES | YES | YES | YES | no | no | YES | no | no | no | no | no | no | no |
(?ismxn:group) 模式修饰器仅应用于本组 |
YES | YES | YES | YES | YES | no | no | YES | no | no | no | no | no | no | no |
原子组与占位量词(possessive quantifiers) | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?>regex) 原子组 |
YES | YES | YES | YES | YES | no | no | YES | no | no | no | no | no | no | no |
?+ , *+ , ++, {m,n}+ 占位量词 |
YES | no | YES | no | YES | no | no | no | no | no | no | no | no | no | no |
断言 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?=regex) 正预测先行断言 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | no | no |
(?!regex) 负预测先行断言 |
YES | YES | YES | YES | YES | YES | YES | YES | YES | no | no | no | no | no | no |
(?<=text) 正回顾后发断言 |
full regex | full regex | finite length | fixed length | fixed + alternation | no | fixed length | no | no | no | no | no | no | no | no |
(?<!text) 负回顾后发断言 |
full regex | full regex | finite length | fixed length | fixed + alternation | no | fixed length | no | no | no | no | no | no | no | no |
从上个匹配继续 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\G 匹配尝试的开始 |
YES | YES | YES | YES | YES | no | no | YES | no | no | no | no | no | no | no |
条件 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?(?=regex)then|else) 使用任意断言 |
YES | YES | no | YES | YES | no | no | no | no | no | no | no | no | no | no |
(?(regex)then|else) |
no | YES | no | no | no | no | no | no | no | no | no | no | no | no | no |
(?(1)then|else) |
YES | YES | no | YES | YES | no | YES | no | no | no | no | no | no | no | no |
(?(group)then|else) |
YES | YES | no | no | YES | no | YES | no | no | no | no | no | no | no | no |
注释 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?#comment) |
YES | YES | no | YES | YES | no | YES | YES | YES | no | no | no | no | no | no |
忽略空白 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
支持忽略空白语法 | YES | YES | YES | YES | YES | no | YES | YES | YES | no | no | no | no | no | YES |
字符类作为整体 | YES | YES | no | YES | YES | n/a | YES | YES | YES | n/a | n/a | n/a | n/a | n/a | YES |
# 开启注释 | YES | YES | YES | YES | YES | n/a | YES | YES | YES | n/a | n/a | n/a | n/a | n/a | no |
Unicode 字符 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\X Unicode 字素 |
YES | no | no | YES | option | no | no | no | no | no | no | no | no | no | no |
\u0000 ~ \uFFFF (Unicode 字符) |
YES | YES | YES | no | no | YES | u"string" | no | YES | no | no | no | no | no | no |
\x{0} ~ \x{FFFF} (Unicode 字符) |
YES | no | no | YES | option | no | no | no | no | no | no | no | no | no | no |
Unicode 属性, 脚本与区块 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\pL ~ \pC (Unicode 属性) |
YES | no | YES | YES | option | no | no | no | no | no | no | no | no | no | no |
\p{L} ~ \p{C} (Unicode 属性) |
YES | YES | YES | YES | option | no | no | no | no | no | no | no | no | YES | YES |
\p{Lu} ~ \p{Cn} (Unicode 属性) |
YES | YES | YES | YES | option | no | no | no | no | no | no | no | no | YES | YES |
\p{L&} , \p{Letter&} 等同于 [\p{Lu}\p{Ll}\p{Lt}] Unicode 属性 |
YES | no | no | YES | option | no | no | no | no | no | no | no | no | no | no |
\p{IsL} ~ \p{IsC} (Unicode 属性) |
YES | no | YES | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{IsLu} ~ \p{IsCn} (Unicode 属性) |
YES | no | YES | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{Letter} ~ \p{Other} (Unicode 属性) |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{Lowercase_Letter} ~ \p{Not_Assigned} (Unicode 属性) |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{IsLetter} ~ \p{IsOther} (Unicode 属性) |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{IsLowercase_Letter} ~ \p{IsNot_Assigned} (Unicode 属性) |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{Arabic} ~ \p{Yi} (Unicode 脚本) |
YES | no | no | YES | option | no | no | no | no | no | no | no | no | no | no |
\p{IsArabic} ~ \p{IsYi} (Unicode 脚本) |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{BasicLatin} ~ \p{Specials} (Unicode 区块) |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{InBasicLatin} ~ \p{InSpecials} (Unicode 区块) |
YES | no | YES | YES | no | no | no | no | no | no | no | no | no | no | no |
\p{IsBasicLatin} ~ \p{IsSpecials} (Unicode 区块) |
YES | YES | no | YES | no | no | no | no | no | no | no | no | no | YES | YES |
上方 {} 中的内容忽略大小写 |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
上方语法中长名称允许空格,边字符,下划线 (如 BasicLatin 可写为 Basic-Latin 或 Basic_Latin 或 Basic Latin ) |
YES | no | Java 5 | YES | no | no | no | no | no | no | no | no | no | no | no |
\P 上方所有 \p 的反义 |
YES | YES | YES | YES | option | no | no | no | no | no | no | no | no | YES | YES |
\p{^...} 上方所有 \p{...} 的反义 |
YES | no | no | YES | option | no | no | no | no | no | no | no | no | no | no |
命名捕获与后向引用 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?<name>regex) .Net 风格的命名捕获分组 |
YES | YES | no | no | no | no | no | no | no | no | no | no | no | no | no |
(?'name'regex) .Net 风格的命名捕获分组 |
YES | YES | no | no | no | no | no | no | no | no | no | no | no | no | no |
\k<name> .Net 风格的命名后向引用 |
YES | YES | no | no | no | no | no | no | no | no | no | no | no | no | no |
\k'name' .Net 风格的命名后向引用 |
YES | YES | no | no | no | no | no | no | no | no | no | no | no | no | no |
(?P<name>regex) Python 风格的命名捕获分组 |
YES | no | no | no | YES | no | YES | no | no | no | no | no | no | no | no |
(?P=name) Python 风格的命名后向引用 |
YES | no | no | no | YES | no | YES | no | no | no | no | no | no | no | no |
多个捕获组同名 | YES | YES | n/a | n/a | no | n/a | no | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
XML 字符类 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\i , \I , \c , \C XML 名称字符类 |
no | no | no | no | no | no | no | no | no | no | no | no | no | YES | YES |
[abc-[abc]] 字符类差集 |
YES | 2.0 | no | no | no | no | no | no | no | no | no | no | no | YES | YES |
POSIX 方括号表达式 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
[:alpha:] POSIX 字符类 |
YES | no | no | YES | ascii | no | no | YES | YES | YES | YES | YES | YES | no | no |
\p{Alpha} POSIX 字符类 |
YES | no | ascii | no | no | no | no | no | no | no | no | no | no | no | no |
\p{IsAlpha} POSIX 字符类 |
YES | no | no | YES | no | no | no | no | no | no | no | no | no | no | no |
[.span-ll.] POSIX 排序序列 |
no | no | no | no | no | no | no | no | YES | YES | YES | YES | YES | no | no |
[=x=] POSIX 等值字符 |
no | no | no | no | no | no | no | no | YES | YES | YES | YES | YES | no | no |
QQ一群 247823727
QQ二群 166427999
博客文件如果不能下载请进群下载
如果公司项目有技术瓶颈问题,请联系↓↓
如果需要定制系统开发服务,请联系↓↓
技术服务QQ: 903464207
QQ二群 166427999
博客文件如果不能下载请进群下载
如果公司项目有技术瓶颈问题,请联系↓↓
如果需要定制系统开发服务,请联系↓↓
技术服务QQ: 903464207