我正在尝试在flex中创建一个简单的状态机,它必须确保跨越多行的字符串必须具有\
换行符。具体地:
"this is \
ok"
"this is not
ok"
第一个是有效的。第二个不是。
我有以下状态机:
expectstring BEGIN(expectstr);
<expectstr>[^\n] {num_lines++;}
<expectstr>\ {flag = true;}
<expectstr>\n {printf("%s\n", flag ? "True" : False);}
但是当我尝试编译这个状态机时,flex告诉我\
的规则无法匹配。那是为什么?
我看过this,但无法理解。
答案 0 :(得分:1)
在flex中,以下模式匹配换行符以外的任何内容:
.
您也可以将其写为
[^\n]
但。更为正常。
为了匹配反斜杠,你可以写
\\
"\\"
[\\]
同样,第一种是通常的方式。
了解[...]
是一种表示一组字符的方式很重要,并且大多数正则表达式运算符只是括号内的普通字符。类似地,"..."
是表示字符序列的一种方式,大多数正则表达式运算符只是引号内的普通字符。
因此,
[a|b]
匹配一个字符,如果它是 a , | 或 b "a|b"
匹配三个字符的序列 a | b and|but
匹配任意三个字符的序列 a n 。d 或 b u t 由于flex允许您匹配正则表达式,因此您根本不需要手动构建状态机。只需使用适当的正则表达式。例如,以下内容将匹配以&#34; 开头和结尾的字符串,其中 \ 可用于转义自身以及换行符,以及换行符(除了逃脱的)是非法的。我认为这是你的目标。
\"([^"\n\\]|\\(.|\n))*\"
你应该确保你理解它的运作方式;互联网上的正则表达式有很多很好的解释(更糟糕的是,所以试着找一个知道他们在说什么的人写的)。这是摘要:
\" A literal double-quote
(...)* Any number of repetitions of:
[^"\n\\] Anything other than a double-quote, newline, or backslash
| Or
\\ A literal backslash, followed by
(...) Grouping
. Anything other than a newline
| Or
\n a newline