Javascript中复杂的字符串解析

时间:2014-02-21 00:40:07

标签: javascript jquery regex string parsing

我试图在JavaScript中解析一个复杂的字符串,而且我对正则表达式非常可怕,所以我运气不好。数据被加载到一个格式如下的变量:

Miami 2.5 O (207.5) 125.0 | Oklahoma City -2.5 U (207.5) -145.0 (Feb 20, 2014 08:05 PM)

我试图按照以下参数解析该字符串:

1)每个值必须加载到他们自己的变量中(IE:迈阿密的单独变量,2.5 O,(207.5)等)
2)字符串必须以管道字符分割(我使用.split(“|”)) 3)我正在处理包含空格的城市名称 4)必须隔离并删除最后的日期

我有一种感觉必须使用正则表达式,但我非常希望有一种不同的方法来解决这个问题。提供的示例就是一个来自更大数据集的示例。如果需要,我可以提供完整的数据集。

我的问题的更直接版本:鉴于上面的数据,我可以使用哪些概念/过程来智能地将字符串元素解析为它们自己的变量?

如果必须使用RegEx,我需要多个表达式吗?

提前感谢您的帮助!

编辑:为了提供解决方案的多种途径,我也将解释这个首要问题。此数据是RSS / XML项的返回。上面提到的字符串是体育赔率,并且都包含在我正在使用的订阅源的标题节点中。如果有人有更好的体育赔率的XML / RSS提要,我也会为此感到欣喜若狂。

编辑2:感谢回复,我可以运行与所需数据点匹配的RegEx。我现在无法迭代匹配并正确返回它们。我将RegEx加载到它自己的函数中:

function regExExtract (txt){
    var exp = /([^|\d]+) ([-\d.]+ [A-Z]) (\([^)]+\)) ([-\d.]+) (\([^)]+\))?/g;
    var comp_arr = exp.exec(txt);

    return comp_arr;        
}

正在调用它:

var title_arr = regExExtract(title);  

标题加载了上面列出的数据字符串。我假设我正确使用全局标志以确保考虑所有匹配,但我不确定我是否正确加载匹配。我为自己的无知道歉,这对我来说都是全新的。

根据下面的要求,我的预期输出最终是一个表格,每个城市都有一行,及其后续数据。每行中的每个单元格对应一个数据点。

我已经创建了一个JS Fiddle,我已经完成了什么,以及预期的输出是什么: http://jsfiddle.net/vDkQD/2/

潜在的最终编辑:在Robin和rewt的帮助下,我想出了:
http://jsfiddle.net/hMJx3/

2 个答案:

答案 0 :(得分:2)

不是像

那样的正则表达式
/([^|\d]+) ([-\d.]+ [A-Z]) (\([^)]+\)) ([-\d.]+) (\([^)]+\))?/g

诀窍?显然,这是基于你给出的示例字符串,如果有其他模式可能会更新...但如果它是 修复它不是那么复杂。

之后您只需要浏览每个匹配的捕获组,您就可以解析数据了。有趣的现场演示:http://regex101.com/r/kF5zD3

<强>解释

  • [^|\d] evrything但管道或数字。这是为了解释[a-zA-Z ]可能无法捕获的奇怪城市名称
  • [-\d.]数字,点或连字符
  • \([^)]+\)左括号,一切不是右括号,右括号。

关于正则表达式的快速不完整指针

  • 这里,正则表达式是/之间的部分。后面的g是一面旗帜,多亏了它,正则表达式在点击第一场比赛后不会停止并将返回每场比赛
  • 匹配是整个表达式找到的。在这里,匹配将是字符串中两个|之间的所有内容。捕获组是一个非常有用的工具,它允许您从这个匹配中提取数据:它们由括号分隔,括号是正则表达式中的特殊字符。 (a)b将与ab匹配,此匹配的第一个捕获组将为a
  • [...]意味着里面的每个角色都会这样做。 [abc]将与abc匹配。
  • +是一个量词,另一个特殊字符,意思是“我之前的一个或多个”。 a+表示“一个或多个a,将与aaaaa匹配。
  • \d[0-9]的快捷方式(是的,-[...] 中的特殊范围字符。这就是为什么在{{ 1}},相当于[-\d.],它直接在开头括号之后)
  • 由于括号是特殊字符,当您实际想要匹配需要转义的括号时:正则表达式[-0-9.]将匹配(\(a\))b,此匹配的第一个捕获组将为(a)b括号
  • (a)表示前面的是可选的(零个或一个实例)
  • ?当放在^语句的开头时,意味着“除了括号中的内容之外的所有内容”。 [...]将与[^a]+匹配,但不会与bcd-*ù
  • 匹配

如果你真的对正则表达式一无所知,因为我相信它们是适合你案例的工具,我建议你快速浏览一下tuto,以便更好地了解你正在处理什么。设置标记,循环匹配及其各自捕获的组的方式取决于您的语言以及您如何调用正则表达式。

答案 1 :(得分:1)

[A-z][a-z]+( [A-z][a-z]+)* -?[0-9]+\.[0-9] [OU] \(-?[0-9]+\.[0-9]\) -?[0-9]+\.[0-9]

在以下假设下,这应匹配长字符串的单个部分:

  • 城市只包含字母字符,每个字都以大写字母开头,且至少有2个字符。
  • 数字有一个可选的符号,小数点后面只有一位数
  • 单个字符是O或U

现在由你决定:

  • 正确创建捕获括号
  • 检查我的假设是否正确

为了匹配日期:

\([JFMASOND][a-z]{2} [0-9]?[0-9], [0-9]{4} [0-9]{2}:[0-9]{2} [AP]M\)$