Ruby:不寻常的行为在匹配方法名称及其正文中

时间:2011-11-04 06:02:54

标签: ruby regex

这是作业。如果正在执行此任务的其他人发现此代码,请不要复制它。

编辑:道歉,因为这项工作现在可以复制了,请相信我,我会向我的教授询问他对此事的看法。

所以我有一些文件包含这样的内容

public Test();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable: 
   line 3: 0


public static void main(java.lang.String[]);
  Code:
   Stack=3, Locals=3, Args_size=1
   0:   new #2; //class java/util/Scanner
   3:   dup
   4:   getstatic   #3; //Field java/lang/System.in:Ljava/io/InputStream;
   7:   invokespecial   #4; //Method java/util/Scanner."<init>":(Ljava/io/InputStream;)V
   10:  astore_1
   11:  aload_1
   12:  invokevirtual   #5; //Method java/util/Scanner.nextLine:()Ljava/lang/String;
   15:  astore_2
   16:  getstatic   #6; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:  aload_2
   20:  invokestatic    #7; //Method add_periods:(Ljava/lang/String;)Ljava/lang/String;
   23:  invokevirtual   #8; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   26:  return
  LineNumberTable: 
   line 6: 0
   line 8: 11
   line 9: 16
   line 10: 26

我试图将输出分开,以便第一个输出如下。

public Test();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable: 
   line 3: 0

,第二个输出是第二个方法。假设我不能使用双重新行字符作为分隔符使用拆分,因为这里未显示的某些输出将被抓取,我宁愿不抓取。

我的正则表达式如下所示。

files.scan(/.*\)\;\n(.+\n)*/)

正则表达式尝试执行的操作如下: 正则表达式.*\)\;的第一部分试图匹配方法名称,它工作正常。 第二部分应该匹配它后面的每一行并停止,直到它看到一个双重新行字符,在哪个阶段它失败,因为有一个双新行字符。 它返回的是每个方法的最后一行,我不知道为什么。 python中的相同正则表达式如下所示获取整段代码,但这不是

ANSWER=re.search(r'.*\);\n(.+\n)*', STRING)

有人可以解释为什么它不起作用吗?

因为这是一项任务,请不要给出代码来解决我想要做的问题。我很感激,谢谢。

2 个答案:

答案 0 :(得分:0)

我在Python中测试了它,它的工作方式与Ruby相同。捕获组1的内容是最后一行(ANSWER.group(1))。也许你检查了ANSWER.group(0)那里你会找到与模式匹配的完整部分。我没有看到Ruby的扫描方法具有此功能ruby-doc

如果你有一个带有量词的捕获组,那么在该组中总会有最后一个与该组匹配的东西。

所以我的想法是显式捕获第一行,然后使用非捕获组捕获其余非空行。

答案 1 :(得分:0)

问题是如果有任何组,scan只返回一组数组匹配(正则表达式的括号部分)。要避免括号内的部分成为一个组,您可以修改正则表达式以使用(?:...)而不是(...)scan将返回整个匹配的数组。

或者,您可以通过变量scan$1,...和{{}向$2移交有权访问群组以及整个匹配的$& {1}}。

请参阅Ruby's doc for scan