当模式“prefix”是可变的时,如何使用正则表达式拆分字符串

时间:2012-09-19 18:46:11

标签: regex coldfusion

我有以下字符串:

  

Giants 2 9 : 10 L.Tynes 22 yd . Field Goal ( 4 - - 3 , 1 : 20 ) 0 3 Cowboys 2 1 : 01 K.Ogletree 10 yd . pass from T.Romo ( D.Bailey kick ) ( 7 - 73 , 2 : 33 ) 7 3 Cowboys 3 10 : 24 K.Ogletree 40 yd . pass from T.Romo ( D.Bailey kick ) ( 9 - 80 , 4 : 36 ) 14 3 Giants 3 5 : 11 A.Bradshaw 10 yd . run ( L.Tynes kick ) ( 9 - 89 , 5 : 13 ) 14 10 Cowboys 3 0 : 40 D.Bailey 33 yd . Field Goal ( 8 - 65 , 4 : 31 ) 17 10 Cowboys 4 5 : 57 M.Austin 34 yd . pass from T.Romo ( D.Bailey kick ) ( 8 - 82 , 7 : 06 ) 24 10 Giants 4 2 : 36 M.Bennett 9 yd . pass from E.Manning ( L.Tynes kick ) ( 12 - 79 , 3 : 21 ) 24 17 Time : 2 : 53

子字符串的前缀可以是“Cowboys”或“Giants”。该字符串始终以右括号)和两个数字结尾。

我甚至无法想象Regex要使用什么。我可以使用字符串函数并循环遍历字符串,但是一个正则表达式会帮助我以后。也许我可以使用分割功能,但这是我的头脑。

我想我可以解析“牛仔”然后“巨人”。

2 个答案:

答案 0 :(得分:1)

我认为这个RegEx给出了你想要的东西:

(Cowboys|Giants).*?\)\s\d+\s\d+

“牛仔”或“巨人”后跟任意字符,直到你得到一个正确的paren,一个空格,一些数字,一个空格和一些更多的数字。

答案 1 :(得分:0)

我不知道ColdFusion,但这可以在python中完成:

match = re.findall(re.compile('((Giants|Cowboys)(.(?!Cowboys|Giants))*.)', re.DOTALL), s)

其中s是提供的字符串。 re.DOTALL表示.匹配空格。 re.findall表示进行全局搜索,reFindAll可能也会这样做。

正则表达式做到了这一点:

  • 创建生成组
  • 寻找“Giants”或“Cowboys”作为起始字符串
  • 查找任何未跟随字符串“Cowboys”或“Giants”的字符(.)并尽可能多地匹配(这意味着匹配所有字符,直到“Cowboys”或“巨人”。
  • 匹配另一个角色。

由于有三个组,您感兴趣的组在ColdFusion中的编号可能不同。在python中,它们嵌入在父组中。

>>> match[0]
('Giants 2 9 : 10 L.Tynes 22 yd . Field Goal ( 4 - - 3 , 1 : 20 ) 0 3', 'Giants', '3')
>>> match[1]
('Cowboys 2 1 : 01 K.Ogletree 10 yd . pass from T.Romo ( D.Bailey kick ) ( 7 - 73 , 2 : 33 ) 7 3', 'Cowboys', '3')
>>> match[2]
('Cowboys 3 10 : 24 K.Ogletree 40 yd . pass from T.Romo ( D.Bailey kick ) ( 9 - 80 , 4 : 36 ) 14 3', 'Cowboys', '3')

我认为在大多数其他语言中,您会改为match[1], match[4], match[7], ...