此问题已经在这里有了答案:
在lex中,以下字符串应匹配并捕获
semic
semiconductor
semicondu
使用c来完成,代码可能类似于以下内容:
strlen(str)>=5 && strncmp(str, "semiconductor", strlen(str))==0;
正则表达式或(lex规则和操作)如何做到这一点?
前缀标识的正则表达式为:
semic(o(n(d(u(c(t(or?)?)?)?)?)?)?)?
但是那可能不是您想要的。
您可以执行C代码之前:
if (strlen(str)>=5 && strncmp(str, "semiconductor", strlen(str))==0)
您必须已经“捕获” str
。也就是说,您使用了其他模式从输入中删除str
。也许您会读字符,直到碰到空白。或者,您可能会读字母,直到找到一个非字母字符。或其他一些算法。
换句话说,您首先从输入流中识别出感兴趣的令牌,然后才检查它是否是目标的前缀。
这很重要,因为(大概)有很多您不希望匹配的单词,尽管它们包含semiconductor
前缀。像semicircle
和semicolon
。或prossemica
。
令牌化是将输入拆分为令牌的任务,然后可以以某种方式对其进行处理。例如,在尝试匹配特定单词之前,我们可能将句子分解为单词,标点和空白。这是(lex)专为帮助您的任务。它并非旨在在输入流中搜索特定模式。
并不是说(f)lex无法帮助您解决问题。但是,为了了解它如何为您提供帮助,有必要进一步了解您要解决的问题,尤其是您希望如何对输入进行标记。