跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 用中文 API 让正则表达式更易读写?
未分類
20 11 月 2020

用中文 API 让正则表达式更易读写?

用中文 API 让正则表达式更易读写?

資深大佬 : xuanwu 4

原文:《用中文 API 让正则表达式更易读写?》

木兰语言重现项目中用到了不少正则表达式,其中不乏不那么一目了然的( Python 实现):

标识符:r'$?[_a-zA-Zu4e00-u9fa5][_a-zA-Z0-9u4e00-u9fa5]*'    双引号字符串:r'(")((?<!\)\1|.)*?1'  字符串插值相关:r'\(([^\)]*)\)|`([^`]*)`' 

由此想到是否有 API 能够构建正则表达式。找到 PythonVerbalExpressions,它首页上一个示例如下:

verbal_expression. start_of_line(). find('http'). maybe('s'). find('://'). maybe('www.'). anything_but(' '). end_of_line() 

对应正则: ^( http)(s)?(://)(www.)?([^ ]*)$

看起来的确比较可读,而且如果改为中文 API 的话,命名会更简短:

开头(). 寻找('http'). 或许('s'). 寻找('://'). 或许('www.'). 除了(' '). 结尾() 

问题是这个库的功能似乎有限,仅支持小部分正则语法,于是考虑改进。

设想中的 API 示例

以开头的木兰实现中的几个正则为例,用设想中的 API 表达后进行对比

标识符:

至多一个("$").一个("_", 大小写英文, 中文).任意个("_", 大小写英文, 数字, 中文)  原始正则表达式对比:r'$?[_a-zA-Zu4e00-u9fa5][_a-zA-Z0-9u4e00-u9fa5]*'        

双引号字符串:

分组(双引号)   .最小匹配(     任意个(       分组(         皆可(           前面不是(反斜杠).一个(反斜杠).一个(引用分组(1)),           一个(非换行字符))       )     )   )   .引用分组(1)  r'(")((?<!\)\1|.)*?1' 

字符串插值相关:

皆可(   一个(反斜杠).一个(左小括号).分组(任意个(不是(反斜杠, 右小括号))).一个(反斜杠).一个(右小括号),   一个(反引号).分组(任意个(不是(反引号))).一个(反引号) )  r'\(([^\)]*)\)|`([^`]*)`' 

相对原始正则表达式,在可读性之外还有几个优势:

  • 不需为正则的特殊意义字符加反斜杠,如 ,(,) 等
  • 明确运算优先级,比如双引号字符串中的 | 和 (?<!)…

在易写方面,相对于正则的符号语法,API 语义更加直白。

欢迎意见建议。

大佬有話說 (0)

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具