为什么这个看起来正确的正则表达式在Rascal中无法正常工作?

时间:2017-11-26 19:22:56

标签: regex 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版本。

2 个答案:

答案 0 :(得分:2)

实际上,在线正则表达式测试仪给出了与我们相同的匹配。您可以按如下方式查看匹配:

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

这是将匹配的字符串分配给w1,然后在垂直条之间打印,假设匹配成功(如果它没有,则返回false,因此if的主体不会执行)。如果你这样做,你将得到一个匹配空字符串:

The match is: ||

在线正则表达式测试人员说同样的事情:

 Match 1
 Full match 0-0 ''

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

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

请注意,您也可以使用i跟随正则表达式匹配不区分大小写,如下所示:

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

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

答案 1 :(得分:0)

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

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