V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
xuanwu
V2EX  ›  奇思妙想

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

  •  
  •   xuanwu · 2020-12-01 16:14:50 +08:00 · 839 次点击
    这是一个创建于 1248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文:《用中文 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 语义更加直白。

    欢迎意见建议。

    learningman
        1
    learningman  
       2020-12-06 10:52:46 +08:00 via Android
    换成中文不会降低学习成本,只会让学会以后更麻烦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2312 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:36 · PVG 20:36 · LAX 05:36 · JFK 08:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.