首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含连字符和斜线的字母数字字符串正向断言的Flex规则

包含连字符和斜线的字母数字字符串正向断言的Flex规则
EN

Stack Overflow用户
提问于 2017-06-13 00:54:11
回答 1查看 357关注 0票数 1

我在为某种类型的令牌构建一个具有积极前瞻性断言的flex规则时遇到了一些麻烦,可能需要一些帮助。我肯定我在这里错过了一些简单的东西。

我想匹配的令牌字符串如下所示:

代码语言:javascript
复制
33-abc-13/12
99-ab-33
o3sehh04/00
glu6-840d/00
vm-22hd
xyz-3

要匹配的令牌对象是包含letters and digits的字符串,并且具有slashes and/or hyphens,这是一种罕见的情况a dot,可能类似于xx-3006/10.00

不能匹配的(因为其他规则涵盖了这些情况)是标记,例如:

代码语言:javascript
复制
numeric370
hyphen-term
plainterm
00/40

到目前为止,我尝试的是这条向前看的规则:

代码语言:javascript
复制
([a-z0-9/-]*)/[-/]+[0-9/-]+

有了以上,我得到了接近我想要达到的结果。它匹配以上列出的所有字符串,但跳过最后一个字符或数字。匹配的令牌如下所示:

代码语言:javascript
复制
33-abc-13/1
o3sehh04/0
...

不幸的是,该规则还与00/40匹配(结果是00/4)。

所以我的问题是我在这里错过了什么?如果可能并且足够快的话,最好用一条规则来覆盖这些情况。我知道在lexer脚本中处理规则的顺序,因此该规则的位置将是整个集合中第一批规则之一。如果不可能,也许对这一规则进行细分将是另一种方式。

在这个项目中,我使用RE (https://github.com/Genivia/RE-flex),因为它涵盖了flex接口,并提供了unicode (我需要处理wchar_t字符串)。我的lexer是一个带有令牌分类的空格标记器,它基本上是几年前构建在flex 2.5包上的。我在令牌处理中重构了一些东西,并移到了re,因为它给了我更多的机会。令牌程序输入字符串是简短的简单文本片段,它们不超过250-300个字符的长度。到目前为止背景。

注意:在为lexer转换规则之前,我使用regex101.com在构建规则时进行检查/实验。走到正确的方向有点帮助,但仅此而已。

任何帮助都是非常感谢的,谢谢您的努力!

更新:基于rici的答案的最后的模式现在如下所示:

代码语言:javascript
复制
[a-z0-9/.-]*[/.-][0-9/-]+

这还包括包含.的令牌,例如

代码语言:javascript
复制
xx33-4.00
f/44-7.87
...

在我下面的评论中,考虑到句子分隔符的问题,在模式的最后一个字符组中只是一个.。我删除了它,现在它按预期工作了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-13 02:04:06

我对RE-flex一无所知(虽然它看起来很酷),但假设它确实与flex兼容,那么同样的方法应该会奏效:忘记前向查找断言(因为匹配的字符串不包括查找模式,所以您希望匹配整个字符串),并在所有可能匹配相同内容的其他规则之后将规则放在一起。

弹性规则是:

  • 比赛时间最长的模式获胜,但
  • 如果两个或多个模式都匹配最长的匹配,则文件中的第一个模式将获胜。

例如,假设您有模式:

代码语言:javascript
复制
[0-9]+("/"[0-9]+)*          { return SLASHED_NUMBERS; }
[a-z0-9/-]*[/-][0-9/-]+     { return GENERAL_TOKEN;   }

注1

这两个标记都将与00/40匹配,因此如果这是输入点上的令牌,则该令牌将被检测为SLASHED_NUMBERS (文件中的第一个规则)。另一方面,如果您有00/49-23,它将被检测为GENERAL_TOKEN,因为该规则匹配更多的字符。

备注

  1. 我是根据你的判罚做的。我不明白“一个点的罕见情况”,它似乎没有反映在你的模式;此外,你的模式似乎比仅仅是“字母,数字,连字符和斜杠”更具体,但我不知道具体是什么。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44510775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档