我目前正在使用Ruby on Rails(在Eclipse中)开展一个项目,我的任务是使用正则表达式将一个数据块拆分成相关的部分。
我决定根据3个参数分解数据:
/^[A-Z]/
)/$":"/
)我会感激任何帮助....我在我的控制器中使用的代码是:
@f = File.open("report.rtf")
@fread = @f.read
@chunk = @fread.split(/\n/)
其中@chunk
是将由拆分创建的数组,@fread
是正在拆分的数据(按新行划分)。
感谢任何帮助,非常感谢!
我无法发布确切的数据,但它基本上是由此(这与医学相关)
考试1:CBW 8080
结果:
本报告由具体测量决定。 请参阅原始报告。
比较:2012年1月30日,3/8/12,4/9/12
RECIST 1.1: BLAH BLAH BLAH
理想的输出是一个数组:
["Exam 1:", "CBW 8080", "RESULT", "This report is dictated with specific measurement. Please see the original report.", "COMPARISON:", "1/30/2012, 3/8/12, 4/9/12", "RECIST 1.1:", "BLAH BLAH BLAH"]
PS我只是使用\ n作为占位符,直到我开始工作
答案 0 :(得分:3)
鉴于澄清的问题,这是一个新的解决方案。
<强>已更新强>
首先将整个数据块(包括换行符和所有数据)“Slurp”成一个字符串。
str = IO.read("report.rtf")
然后使用这个正则表达式:
captures = str.scan(/(?<=^|[\r\n])([A-Z][^:]*):([^\r\n]*(?:[\r\n]+(?![A-Z].*:).*)*)/)
请在此处查看实时示例:http://rubular.com/r/8w3X6WGq4l。
答案解释道:
(?<= Lookbehind assertion.
^ Start at the beginning of the string,
| or,
[\r\n] a new line.
)
( Capture group 1, the "key".
[A-Z][^:]* Capital letter followed as many non-colon
characters as possible.
)
: The colon character.
( Capture group 2, the "value".
[^\r\n]* All characters (i.e. non-newline characters) on the
same line belongs to the "value," so take them all.
(?: Non-capture group.
[\r\n]+ Having already taken everything up to a newline
character, take the newline character(s) now.
(?! Negative lookahead assertion.
[^A-Z].*: If this next line contains a capital letter,
followed by a string of anything then a colon,
then it is a new key/value pair, so we do not
want to match this case.
)
.* Providing this isn't the case though, take the line!
)* And keep taking lines as long as we don't find a
key/value pair.
)
答案 1 :(得分:0)
我不完全确定你在寻找什么。如果您希望所有出现的大写字母后跟一些文本和分号,那么您可以这样做:
str.scan(/[A-Z].*?:/)
答案 2 :(得分:0)
这应该这样做。
/^[A-Z].*:$/
答案 3 :(得分:0)
正则表达式可以是:/(^[A-Z].*\:)/m
并通过添加:
@chunk = @fread.scan(/(^[A-Z].*\:)/m)
提供@fread是一个字符串。您可以使用http://rubular.com/在ruby中测试正则表达式。
答案 4 :(得分:0)
又一个解决方案:
input_str.split("\r\n").each |s| do
var_name = s.split(": ")[0]
var_value = s.split(": ")[1]
# do whatever you like
done