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

2020-12-01 16:14:50 +08:00
 xuanwu

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

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

标识符:r'\$?[_a-zA-Z\u4e00-\u9fa5][_a-zA-Z0-9\u4e00-\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-Z\u4e00-\u9fa5][_a-zA-Z0-9\u4e00-\u9fa5]*'       

双引号字符串:

分组(双引号)
  .最小匹配(
    任意个(
      分组(
        皆可(
          前面不是(反斜杠).一个(反斜杠).一个(引用分组(1)),
          一个(非换行字符))
      )
    )
  )
  .引用分组(1)

r'(\")((?<!\\)\\\1|.)*?\1'

字符串插值相关:

皆可(
  一个(反斜杠).一个(左小括号).分组(任意个(不是(反斜杠, 右小括号))).一个(反斜杠).一个(右小括号),
  一个(反引号).分组(任意个(不是(反引号))).一个(反引号)
)

r'\\\(([^\\\)]*)\\\)|`([^`]*)`'

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

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

欢迎意见建议。

920 次点击
所在节点    奇思妙想
1 条回复
learningman
2020-12-06 10:52:46 +08:00
换成中文不会降低学习成本,只会让学会以后更麻烦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731020

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX