有多个匹配时如何匹配一个字符串

时间:2014-03-09 14:09:38

标签: ruby regex

我试图从只有第一个期刊参考的3-4个条目的文件中提取。关于如何只获得第一次匹配的任何想法?

这是我到目前为止所做的。我可以提取引用,但我得到了所有这些:

if file_line =~ /^  JOURNAL  \*?(.*)/
  captured_journal = $1

更清楚的是,这是我试图仅提取第一个JOURNAL条目的文件中的一部分:

  JOURNAL   Genomics 33 (2), 229-246 (1996)
  PUBMED   8660972
REFERENCE   2  (bases 1 to 17009)
  AUTHORS   Lopez,J.V.
  TITLE     Direct Submission
  JOURNAL   Submitted (07-FEB-1995) Jose V. Lopez, Laboratory of Viral
           Carcinogenesis, PRI/DynCorp, Biological Carcinogenesis and
            Development Prog, Bldg 560, Room 11-21, NCI-Frederick Cancer
           Research and Development Center, Frederick, MD 21702-1201, USA`enter code here`

我只想"Genomics 33 (2), 229-246 (1996)",但我也会收到下一期的参赛作品。

1 个答案:

答案 0 :(得分:1)

很难回答你的问题,你的例子没有显示完整的编码。

一种可能性:你的if file_line在一个循环中。然后你可以离开循环:

filecontent.each_line{|file_line|
  if file_line =~ /^  JOURNAL  \*?(.*)/
    captured_journal = $1 
    break
  end
}

作为替代方案,您可以检查,如果您已找到条目:

captured_journal = nil
filecontent.each_line{|file_line|
  if file_line =~ /^  JOURNAL  \*?(.*)/
    captured_journal = $1 unless captured_journal
  end
}

但也许你不在循环中,文件内容存储在一个字符串中(例如File.read)。然后你可以使用一个简单的正则表达式:

  filecontent =~ /^  JOURNAL  \*?(.*)/
  captured_journal = $1 

  /^  JOURNAL  \*?(.*)/.match(filecontent)[1]

发布更多详细信息后的更正:

您可以使用正则表达式/^\s*JOURNAL\s+(.*)/。您的Regexp使用固定数量的空格。使用\s+时,空格的数量是灵活的。