我正在寻找一个正则表达式来创建一个除了一个之外的所有单词的DFA。
Alphabet = {x,y,z} 单词=除了包含xyz的单词之外的所有可能单词。例如:
有效:xyyzx yyxzyxz yyzzx
无效:x xyz z yxz xyz xyz yxz
感谢。
答案 0 :(得分:1)
您可以使用这样的正则表达式来利用丢弃技术:
[xyz]*xyz[xyz]*|([xyz]+)
<强> Working demo 强>
此正则表达式背后的想法是匹配无效的数据,但捕获重要的数据。
比赛信息是:
MATCH 1
1. [7-12] `xyyzx`
MATCH 2
1. [13-20] `yyxzyxz`
MATCH 3
1. [21-26] `yyzzx`
如您所见,您必须获取捕获组内容才能获取有效数据。
丢弃技术包括丢弃由管道(正则表达式“或”)分隔的正则表达式左侧的所有图案,但使用最右图案中的捕获组。所以,对于这个正则表达式:
[xyz]*xyz[xyz]*|([xyz]+)
discard patt--^ ^--- keep this pattern
答案 1 :(得分:0)
趣!
\b(?:(?!xyz)[xyz])+\b
在字边界之间匹配x,y或z中的一个或多个的序列,其中没有一个是从序列xyz开始的。
(经perl -nE ' say for /(\b(?:(?!xyz)[xyz])+\b)/g '
测试。)
答案 2 :(得分:0)
从您的问题中不清楚如果字符串xyz存在会发生什么。是应该抛出TokenManagerError还是ParseException?通常在JavaCC中,最好接受词汇级别的所有输入 - 即。编写一个不会抛出异常的令牌管理器。这就是我要做的事情。
TOKEN: {
< BAD : (["x","y","z"])* "xyz" (["x","y","z"])* >
< GOOD: (["x","y","z"])+ >
< OTHER: ~[] >
}
void start() : {}{ [<GOOD>] <EOF> }
任何包含字符串&#34; xyz&#34;的文件将导致解析错误。包含x,y或z以外的字符的任何文件都将导致解析错误。任何其他文件都将解析而不会出错。