regex - flex 结合 3 个不同的字母
问题描述
我想用 flex 语言匹配范围 [AE] 中的 3 个不同字母,而不重复其中的任何一个。
例如 ABC、CDE、EAB、
但不是 AAB 或 DEE。
我试过 [A|B|C|D|E]{3}、[A?B?C?D?E?]{3}、[A{0,1}-E{0,1}]{ 3},但没有工作......请帮忙!
解决方案
匹配三个不同字母的一种方法是拼出所有合法组合:
ABC|ABD|ABE|ACB|ACD|... printf("Found one: %s\n", yytext);
我们可以通过对第三个字母使用字符类来缩短它:
AB[C-E]|AC[BCD]|AD[BCE]|... printf("Found one: %s\n", yytext);
鉴于范围仅为 AE,这在一定程度上是可行的,但肯定不是很漂亮。
另一种方法是匹配超过允许的范围,然后拒绝相关操作中的非法组合。这可能看起来像这样:
[A-E]{3} {
if (yytext[0] == yytext[1] || yytext[0] == yytext[2] || yytext[1] == yytext[2]) {
REJECT;
} else {
printf("Found one: %s\n", yytext);
}
}
REJECT
将使它好像模式从未匹配过,因此这将与以前的解决方案相同。
请注意,没有什么可以阻止这些解决方案中的任何一个多次匹配模式——这毕竟是词法分析器的工作方式。所以像这样的输入ABCBCD
会产生以下输出:
Found one: abc
Found one: bcd
由于您在评论中说这不是您想要的,因此您需要一个额外的规则来匹配abcbcd
一个标记,然后产生一条错误消息。如果你真的只想允许只包含三个字符的输入,你可以使用.*
一个模式来匹配不是 3 个非重复 AE 字符的所有内容。不过,这似乎是对 flex 的一种非常奇怪的使用。
推荐阅读
- flutter - 我刚刚开始了我的 Flutter App 开发之旅。我想使用 Stack 和 InkWell 创建动态仪表板
- python - 如何在 Scikit SGDClassifier 中使用 partial_fit 增加迭代次数以优化每一步的成本函数?
- javascript - 只有当第一个(源)observable 发出一个值而不是其他组合的 observable 时,RxJS 才会发出一个值
- function - Kotlin 中的“不兼容的类型:IntRange 和 Int”错误
- maven - 如何仅为多模块项目中的特定模块生成依赖关系树 - MAVEN
- python - Matplotlib - 从图中删除 RectangleSelector 小部件
- reactjs - 我的 React 应用程序没有使用 http-proxy-middleware 注册 setupProxy.js
- vue.js - 如果我的 div 中没有内容,如何添加文本?
- kotlin - 从 Kotlin 中的输入泛型类型映射返回类型
- python-3.x - 任何人都可以在 python 中发布用于 web 应用程序的 Dockerfile 的详细步骤的小示例吗?