为什么这个看似正确的正则表达式在 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。这似乎对我有用。
在有以下代码:
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。这似乎对我有用。