微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式 – 正则表达式的简单示例转换为状态机?

在Stack Overflow播客#36( http://blog.stackoverflow.com/2009/01/podcast-36/)中,表达了这一意见:
一旦知道设置状态机是多么容易,那么永远不会再次使用正则表达式。

我做了一堆搜索。我发现了一些学术论文和其他复杂的例子,但是我想找到一个简单的例子来帮助我理解这个过程。我使用了很多正则表达式,我想确保我再也不会使用“不适当的”。

当然,虽然你需要更复杂的例子来真正了解RE的工作原理。考虑以下RE:
^[A-Za-z][A-Za-z0-9_]*$

这是一个典型的标识符(必须以alpha开头,并且可以包含任意数量的字母数字和不匹配字符,包括none)。以下伪代码显示了如何使用有限状态机完成此操作:

state = FirsTCHAR
for char in all_chars_in(string):
    if state == FirsTCHAR:
            if char is not in the set "A-Z" or "a-z":
                error "Invalid first character"
            state = SUBSEQUENTCHARS
            next char
    if state == SUBSEQUENTCHARS:
            if char is not in the set "A-Z" or "a-z" or "0-9" or "_":
                error "Invalid subsequent character"
            state = SUBSEQUENTCHARS
            next char

现在,正如我所说,这是一个很简单的例子。它不显示如何进行贪婪/非正常匹配,回溯,匹配一行(而不是整行)和状态机的其他更深奥的功能,容易被RE语法处理。

这就是为什么REs如此强大。执行单线RE可以做的实际有限状态机器代码通常是非常长而复杂的。

你可以做的最好的事情是获取一些特定简单语言的lex / yacc(或等效的)代码的副本,并查看它生成代码。它不漂亮(它不一定是因为它不应该被人类阅读,他们应该看看lex / yacc代码),但它可能会给你一个更好的想法,如何工作。

原文地址:https://www.jb51.cc/regex/357350.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐