RegEx:没有子词的单词

时间:2015-03-16 16:29:01

标签: regex javacc dfa

我正在寻找一个正则表达式来创建一个除了一个之外的所有单词的DFA。

Alphabet = {x,y,z} 单词=除了包含xyz的单词之外的所有可能单词。例如:

有效:xyyzx yyxzyxz yyzzx

无效:x xyz z yxz xyz xyz yxz

感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用这样的正则表达式来利用丢弃技术:

[xyz]*xyz[xyz]*|([xyz]+)

<强> Working demo

此正则表达式背后的想法是匹配无效的数据,但捕获重要的数据。

enter image description here

比赛信息是:

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以外的字符的任何文件都将导致解析错误。任何其他文件都将解析而不会出错。