为什么这个看似正确的正则表达式在 Rascal 中不能正常工作?

Why is this seemingly correct Regex not working correctly in Rascal?

在有以下代码:

set[str] noNnoE = { v | str v <- eu, (/\b[^eEnN]*\b/ := v) };

目标是从一组字符串(称为'eu')中过滤掉那些没有'e'或'n'的字符串(大写和小写) .我提供的正则表达式:

/\b[^eEnN]?\b/

当我在 an online regex-tester 中尝试时,它似乎可以正常工作。

在 Rascel 终端中尝试时,它似乎不起作用:

 rascal>/\b[^eEnN]*\b/ := "Slander";
 bool: true

我预计没有匹配。我在这里错过了什么?我在 Eclipse Oxygen1a 中使用最新的(稳定的)Rascal 版本。

实际上,在线正则表达式测试器给出的匹配与我们给出的匹配相同。你可以这样看比赛:

if (/<w1:\b[^eEnN]?\b>/ := "Slander") 
  println("The match is: |<w1>|");

这是将匹配的字符串分配给 w1,然后在竖线之间打印它,假设匹配成功(如果没有,则 returns false,因此正文如果不会执行)。如果你这样做,你会得到一个空字符串的匹配:

The match is: ||

在线正则表达式测试器说了同样的话:

 Match 1
 Full match 0-0 ''

如果您想避免这种情况,您可以使用 + 强制至少出现一次您要查找的字符,而不是 ?:

rascal>/\b[^eEnN]+\b/ := "Slander";
bool: false

请注意,您还可以通过在正则表达式后面加上 i 来使正则表达式匹配不区分大小写,如下所示:

/\b[^en]+\b/i

如果您需要在字符中添加更多字符,这可能会更容易编写 class。

此解决方案 (/\b[^en]+\b/i) 不适用于由两个词组成的字符串,例如 Czech Republic。

尝试/\b[^en]+\b$/i。这似乎对我有用。