0

我有这样的字符串:

journals/cl/SantoNR90:::Michele Di Santo::Libero Nigro::Wilma Russo:::Modula-2 中的程序员定义控制抽象

我需要捕获Michele Di Santo, Libero NigroWilma Russo但不是最后一个。

这个正则表达式几乎符合我的需要:

/(?<=::).*?(?=::)/

但它有问题,它捕获了第三个冒号

str.scan(/(?<=::).*?(?=::)/) #=> [":Michele Di Santo", ...]

如您所见,第一场比赛的开头有一个冒号。

如何修复此正则表达式以避免第三个冒号?

4

3 回答 3

7

不要为此使用正则表达式。您需要做的就是将输入字符串拆分为:::,从结果数组中取出第二个字符串,然后将其拆分为::。与正则表达式版本相比,编码速度更快、运行速度更快且更易于阅读。

编辑:代码:

str.split(':::')[1].split('::')

在 CodePad 上运行:http: //codepad.org/1BNNwoh6

于 2012-10-08T20:32:39.057 回答
3

这样做的表达式可能是:

(?<=::)[^:].*?(?=::)

虽然如果要搜索的字符串始终采用“xxx:::A::B::C:::xxx”的形式并且您只关心 A、B 和 C,请考虑使用更具体的字符串,并使用捕获组以获取 A、B 和 C:

:::(.+?)::(.+?)::(.+?):::

$1,$2并将$3包含组匹配。

于 2012-10-08T20:47:33.737 回答
0

我会使用一个简单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 模块并将字段分隔符设置为 ':'。

于 2012-10-08T21:40:31.373 回答