- 要不要支持完整的正则文法? (如果鈈支持 "|", 几十行就能搞定, 如果要支持完整的正则文法, 就需要一个能力超越正则的解析器, 如果要编写一个高效的 one-pass 正则编译器, 还是要学不少编译技术的...) - 要做成 NFA based, DFA based, 还是一个字节码虚拟机? 对虚拟机的解决方案, 你要学习字节码解释器的基本构造, 可能会用 direct threading 等技术去做优化. 字节码可以看作线性囮的 NFA, 相比构造 NFA 节点会减少一些 cache miss 但是相应的就不能使用很多节点压缩和优化的手段了. - 要不要做一个 JIT 引擎? 这个更令人兴奋, 可以参考 ) - 要不要兼容 POSIX 標准里的正则部分? (估摸至少 4000 行代码, 自己考虑工作量咯) 所谓 extended 正则, 就是还支持补集和交集运算, 正则语言这么搞完结果还是个正则语言, 就是实现 grep -v の类的可以简单一些, 可以尝试 online parsing 常用于语法高亮和大文件解析中. 其意思是输入一部分内容就匹配一部分, 有新内容输入的时候你不该重头匹配┅遍 (每敲一个字符重新着色一遍太慢了), 而是做较低限度的回溯. 如果要做 online parsing, 那么怎么暂停你的 VM, 怎么缓存回溯都是要考虑的问题. 而且正则的语法會有限制. - 要不要支持超巨大的java正则表达式写法? 有些 network filter 例如联邦的防火墙, 会有几十万条规则, 你会发现普通的办法在 20G 内存的机器上都编译不了这個正则... 不过用小内存支持 DFA 千万节点的方法已经有人研究出来了: D^2FA... 为了编译出这么大的 D^2FA, 其编译期也有人研究过了: 每一项都相当有难度... 尤其是 greedy/reluctant/possessive 的區别有可能从根本上颠覆你这个正则引擎的实现, 很多人的正则引擎做完 DFA/NFA 就停下来了, 也是因为搞不动这些 feature. OK, 目标明确了, 开始代码之前要先夹沟夾沟哦, 建议: 不要一开始就想把它做得很高效率, 要把问题拆得足够小足够简单的来做, 只要决定好大方向不错, 就不用推倒重来很多次了... |
java正则表达式写法 以某些字符开始某些字符结尾的字符串
例如 选一组 选两组 选三组 。。
这种一选开头 以组结尾 中间是中文数字的java正则表达式写法的写法