Regex Rascal中正则表达式匹配的大小有限制吗?

Regex Rascal中正则表达式匹配的大小有限制吗?,regex,stack-overflow,rascal,Regex,Stack Overflow,Rascal,在尝试匹配Java源文件中的所有多行注释时,我遇到了一个StackOverflow()错误。当匹配的注释相当大时,就会发生这种情况。我已经或多或少地确定了2500个字符的限制,但这可能是特定于我的环境的 我使用以下表达式来匹配注释: /<comment:((\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/))+>/mi //mi 我应该注意的匹配大小是否有一些限制,或者我的正则表达式中是否存在缺陷 我的目标是: |project://Sev

在尝试匹配Java源文件中的所有多行注释时,我遇到了一个
StackOverflow()
错误。当匹配的注释相当大时,就会发生这种情况。我已经或多或少地确定了2500个字符的限制,但这可能是特定于我的环境的

我使用以下表达式来匹配注释:

/<comment:((\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/))+>/mi
//mi
我应该注意的匹配大小是否有一些限制,或者我的正则表达式中是否存在缺陷

我的目标是:

|project://Sevo1/src/Volume.rsc|(985,32,<53,12>,<53,44>): StackOverflow()
    at countLines(|project://Sevo1/src/Volume.rsc|(985,33,<53,12>,<53,45>))
    at $root$(|prompt:///|(0,73,<1,0>,<1,73>))
|project://Sevo1/src/Volume.rsc|(985,32,,):堆栈溢出()
在计数线上(|project://Sevo1/src/Volume.rsc|(985,33,,))
在$root$(|提示符://|(0,73,,))
不是最佳选择,因为它包含一个
*
-量化捕获组,该组包含在字符串内相同位置匹配的备选方案。您可能会看到
[^*]
匹配任何字符,但
*
(即,它匹配换行符),然后您就有了同样匹配换行符的
[\r\n]
。请注意,您匹配的文本块大部分为1个字符长(除了与
(\*+([^*\/].[\r\n])
匹配的
*
块),而正则表达式引擎在这里似乎无法很好地处理该任务

嵌套量词只有在一次性匹配较长的块时才有效。将模式重新编写为

/<comment:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/>/
//
这样会更有效率。看

详细信息

  • \/\*
    -a
    /*
    子字符串
  • [^*]*\*+
    -0多个字符,而不是
    *
    ,后跟一个或多个文字
    *
  • (?:[^\/*][^*]*\*+)*
    -0+序列:
    • [^\/*][^*]*\*+
      -不是
      /
      *
      (与
      [^/*]
      匹配),后跟0+个非星号字符(
      [^*]*
      ),后跟一个或多个星号(
      \*+
  • \/
    -关闭
    /

因此,比赛本身的规模可能没有限制。问题存在于次优模式中,该模式执行太多回溯操作,导致堆栈溢出错误。这是正确的总结吗?查看stacktrace有助于确保这确实是问题所在。改进的re将使问题很快出现,但Java正则表达式和到Rascal虚拟机/解释器的翻译之间可能仍然存在特定于Rascal的映射问题。@RubenSteins好吧,匹配的大小当然受到保存匹配的变量类型大小的限制。然而,我无法想象你会有那么长的评论。@jurgenv我已经在原始问题中添加了stacktrace(至少我认为是stracktrace)。不确定是否有任何方法可以获得更详细的堆栈跟踪。@WiktorStribiżew我同意。
str
类型可能足够大,可以容纳超过2500个字符的信息,这就是我的初始模式的限制。