0

我有以下字符串:

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 稍后会帮助我。也许我可以使用 split 功能,但这超出了我的想象。

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

4

2 回答 2

1

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

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

“Cowboys”或“Giants”后跟任意字符,直到你得到一个正确的括号、一个空格、一些数字、一个空格和更多数字。

于 2012-09-19T19:12:03.407 回答
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”或“Giants”的字符。
  • 匹配另一个字符。

由于存在三个组,因此您感兴趣的组在 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], ...改为使用。

于 2012-09-19T19:31:16.863 回答