我有这样的弦:
期刊/cl/SantoNR90 90::Michele Di Santo::Libero Ni格罗::Wilma Russo::程序员-用Modula-2定义的控制摘要
我需要捕捉Michele Di Santo,Libero Nigro,Wilma Russo,但不是最后一个。
这个正则表达式几乎符合我所需要的:
/(?<=::).*?(?=::)/但是它有问题,它捕获了第三个冒号。
str.scan(/(?<=::).*?(?=::)/) #=> [":Michele Di Santo", ...]正如您所看到的,第一个匹配的开头有一个冒号。
如何修复这个正则表达式以避免第三个冒号?
发布于 2012-10-08 20:47:33
要这样做的表达式可以是:
(?<=::)[^:].*?(?=::)虽然如果要搜索的字符串总是以“xxx::A :b::C::xxx”的形式搜索,而且您只关心A、B和C,请考虑使用更具体的方法,并使用捕获组获取A、B和C:
:::(.+?)::(.+?)::(.+?):::$1、$2和$3将包含组匹配。
发布于 2012-10-08 20:32:39
别用regex做这个。您所需要做的就是在:::上拆分输入字符串,从结果数组中提取第二个字符串,并在::上拆分该字符串。与regex版本相比,代码更快,运行更快,读起来更容易。
编辑:代码:
str.split(':::')[1].split('::')在CodePad上运行:http://codepad.org/1BNNwoh6
发布于 2012-10-08 21:40:31
我使用一个简单的split,因为字符串基本上是一个带有冒号的CSV,而不是逗号:
str = 'journals/cl/SantoNR90:::Michele Di Santo::Libero Nigro::Wilma Russo:::Programmer-Defined Control Abstractions in Modula-2'
items = split(':')
str1, str2, str3 = items[3], items[5], items[7]
=> [
[0] "Michele Di Santo",
[1] "Libero Nigro",
[2] "Wilma Russo"
]您还可以使用:
str1, str2, str3 = str.split(':').select{ |s| s > '' }[1, 3]如果有可能引用冒号,请使用CSV模块并将字段分隔符设置为“:”。
https://stackoverflow.com/questions/12789023
复制相似问题