gpt4 book ai didi

parsing - 在破折号中捕获包含 -- 但不结束 -- 的名称

转载 作者:行者123 更新时间:2023-12-04 10:24:51 25 4
gpt4 key购买 nike

我正在尝试 捕获名称 (不以数字开头)可能包含破折号 ,例如 hello-world .我的问题是我也有单破折号和与之冲突的符号的规则:

[A-Za-z][A-Za-z0-9-]+     { /* capture "hello-world" */ }
"-" { return '-'; }
">" { return '>'; }

当词法分析器读取 hello-world->之前的规则产量 hello-world-> ,而我预期 hello-world , ->被单独捕获。为了解决它,我以这种方式修复它:
[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]+     { /* ensure final dash is never included at the end */ }

这有效,除了单字母单词,所以最后我实现了这个:
[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]+     { /* ensure final dash is never included at the end */ }
[A-Za-z][A-Za-z0-9]* { /* capture possible single letter words */ }

问题 : 有没有更优雅的方法呢?

最佳答案

[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]+
[A-Za-z][A-Za-z0-9]*


请注意,正如您所说,第一条规则已经涵盖了不是单个字母的所有内容。所以第二条规则只需要匹配单个字母,可以缩短为 [A-Za-z] :
[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]+
[A-Za-z]

现在第二条规则只是第一条规则的前缀,因此我们可以通过将第一个字母后面的部分设为可选来将其合并为一条规则:
[A-Za-z]([A-Za-z0-9-]*[A-Za-z0-9]+)?
+最后一位是不必要的,因为除了最后一个字符之外的所有内容都可以通过中间部分匹配,所以最简单的版本是:
[A-Za-z]([A-Za-z0-9-]*[A-Za-z0-9])?

关于parsing - 在破折号中捕获包含 -- 但不结束 -- 的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60666645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com