有以下代码:
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版本。
答案 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。这似乎对我有用。