gpt4 book ai didi

regex - Flex 正则表达式文字字符

转载 作者:行者123 更新时间:2023-12-02 22:09:35 24 4
gpt4 key购买 nike

我在使用 flex 设置正则表达式来匹配类似 C 的文字字符时遇到了一些问题。

我需要根据语法匹配正确的文字字符和不正确的字符,例如未终止的字 rune 字。

2 条规则,一条用于正确的规则,一条用于未终止的规则。

chrlit          (\')([^\\\'\n]|(\\.))(\')
untermchrlit (\')([\\|\']|(.))*

我需要正则表达式方面的帮助,因为它们无法正常工作。以下是它们应该如何工作的一些示例:

'          -> unterminated char constant
'/' -> CHRLIT('/')
'(' -> CHRLIT('(')
'a"b"c"de -> unterminated char constant
'abc -> unterminated char constant
'abc\ -> unterminated char constant
'\\' -> CHRLIT('\\')
';' -> CHRLIT(';')
'' -> unterminated char constant
'a' -> CHRLIT('a')
'\' -> unterminated char constant
'\;' -> CHRLIT('\;')
'\\\' -> unterminated char constant
'\\\ -> unterminated char constant
'\/' -> CHRLIT('\/')
'a\' -> unterminated char constant
'\\ -> unterminated char constant
'\t' -> CHRLIT('\t')

最佳答案

问题是您的未终止字 rune 字模式也将匹配终止字符以及任何后续字符,除非字 rune 字位于行尾。与其尝试精确匹配未终止的字 rune 字,不如让自己的生活更简单,如果遇到不是开始的 ' ,它会回退到 untermchrlit chrlit 的。 (所以它必须是未终止的,如果 chrlit 匹配所有可能终止的文字。)(我还冒昧地从正则表达式中删除了所有多余的括号和反斜杠,这使它们有点阅读噪音更小。)

chrlit          '([^'\\\n]|\\.)'
untermchrlit '

此解决方案的唯一问题是它将在未终止的 ' 之后立即继续扫描,这很可能会造成人为错误,尤其是在确实存在匹配的 的情况下>',如 'too long'。在这里,您确实希望在第二个 ' 之后继续进行词法扫描(事实上,您可能希望将其标记为过长的字 rune 字,而不是未终止的文字)。要处理这种情况,您需要一组更复杂的模式。这是可能性:

/* As before */
chrlit '([^'\\\n]|\\.)'
/* Also as before, a catch-all case. */
untermchrlit '
/* Try to match single-quoted strings which are too short or too long */
emptychrlit ''
/* The action for this regex *must* come after the action for chrlit */
longchrlit '([^'\\\n]|\\.)+'

我应该注意到 longchrlit 这里也匹配 chrlit 匹配的所有内容,但与 OP 中的模式不同,它不再匹配任何字符。重要的是按照注释指示对操作进行排序,以便 chrlit 匹配正确的文字。 (不过,如果你弄错了顺序,flex 应该会发出警告。)

请记住,Flex 始终匹配最长 匹配项,但如果多个规则匹配完全相同的标记,Flex 会选择第一个 操作。

顺便说一句,至少在 C 中,以下一个有效的字 rune 字:

'a\
'

那是因为 \ 后跟一个换行符被完全从输入中移除,所以第二个 ' 被词法化,就好像它紧跟在 a.

关于regex - Flex 正则表达式文字字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15550553/

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