有很多方法可以解决这个问题。以下是我过去做过类似事情的方式:
str = '01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00'
/(\S+) (\S+) (\d+) (.+) (\S+) (\S+) (\S+)/.match(str).captures
# => ["01.02.2016", "10:35:49", "8998775", "New York", "3:35", "0,00", "0,00"]
str = '01.02.2016 10:35:49 8998775 Chicago 3:35 0,00 0,00'
/(\S+) (\S+) (\d+) (.+) (\S+) (\S+) (\S+)/.match(str).captures
# => ["01.02.2016", "10:35:49", "8998775", "Chicago", "3:35", "0,00", "0,00"]
由于您知道这些字段通常是用空格分隔的,因此您可以利用它们来发挥自己的优势。
如果您需要进一步验证字段:
str = '01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00'
/([\d.]+) ([\d:]+) (\d+) (\D+?) ([\d+:]+) ([\d,]+) ([\d,]+)/.match(str).captures
# => ["01.02.2016", "10:35:49", "8998775", "New York", "3:35", "0,00", "0,00"]
str = '01.02.2016 10:35:49 8998775 Chicago 3:35 0,00 0,00'
/([\d.]+) ([\d:]+) (\d+) (\D+?) ([\d+:]+) ([\d,]+) ([\d,]+)/.match(str).captures
# => ["01.02.2016", "10:35:49", "8998775", "Chicago", "3:35", "0,00", "0,00"]
有时我会使用更像模板的东西:
str = '01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00'
/((?:\d{2}\.){2}\d{4}) ((?:\d{2}:){2}\d{2}) (\d+) (\D+?) (\d+:\d+) ([\d,]+) ([\d,]+)/.match(str).captures
# => ["01.02.2016", "10:35:49", "8998775", "New York", "3:35", "0,00", "0,00"]
str = '01.02.2016 10:35:49 8998775 Chicago 3:35 0,00 0,00'
/((?:\d{2}\.){2}\d{4}) ((?:\d{2}:){2}\d{2}) (\d+) (\D+?) (\d+:\d+) ([\d,]+) ([\d,]+)/.match(str).captures
# => ["01.02.2016", "10:35:49", "8998775", "Chicago", "3:35", "0,00", "0,00"]
地点:
-
\d{2} 表示“两位数”。
-
(?:\d{2}\.) 表示“将两个数字和一个 . 视为一个组,但不要捕获(“记住”)它。
-
(?:\d{2}\.){2} 的意思是“做两次”。
-
((?:\d{2}\.){2}\d{4}) 的意思是“记住所有这些加上接下来的四位数字”。
知道你可以解决模式的其余部分。
优势在于,一旦找出模式,就可以计算出它们重复了多少次。如果源文本稍后更改,则调整数字非常简单。这就是正则表达式的强大之处,当你有重复的模式时,它们会很棒。
话虽如此,我更喜欢不使用正则表达式,因为它们往往很脆弱,如果您不知道引擎如何解析,它们可能真的减慢您的代码。相反,我会使用Damien's 之类的东西,使用split 拆开字符串,然后使用shift 和pop 导致城市被留下。