Javascript - 解析格式化文本并按顺序提取值?

时间:2011-12-14 22:34:47

标签: javascript regex parsing pattern-matching

我有一个带有维基风格渲染的字段,我想在Javascript中破解。

我试图解析的文字如下:

{color:#47B}_name1_{color}
{color:#555}description1{color} 
---
{color:#47B}_name2_{color}
{color:#555}description2{color} 
---
{color:#47B}_name3_{color}
{color:#555}description3{color} 
---
etc

name1和description1属于一起时,name2和description2属于一起,依此类推。名称和描述的值是用户提供的值,描述可能跨越多行。

我的最终目标是能够从文本中提取每个名称和每个描述的值(并且能够将name1与description1等可靠地关联起来)。

我的问题是:如果我使用正则表达式将所有名称匹配到数组中并将所有描述匹配到数组中,是否可以确保数组中的项目的顺序正确?也就是说,名称[0] 总是是解析文本中的第一个名称(假设我在名称数组中执行了javascript正则表达式match)?另外 - 这是不好的做法/我应该采取另一种方式吗?

我试图用来匹配名称的正则表达式是:

/^(\{color\:#47B\})(_)(\s*?)(.*?)(\s*?)(_)(\{color\})$/

我用来匹配描述的正则表达式是:

/(\{color\:#555\})(.*?)(\{color\})/

1 个答案:

答案 0 :(得分:1)

正则表达式搜索将始终按源顺序返回匹配(即按源文本中出现的顺序)。

我假设你问的是这个问题,因为你希望做两个正则表达式匹配(一个用于名称,一个用于描述),然后得到两个结果数组,并保证namesmatch[i]始终与{{1 }}。但是,只有在源文本总是完美无缺的情况下才会出现这种情况。

在这种情况下,使用一次匹配两者的单个正则表达式,或者通过那些descriptionmatch[i]分隔符分割您的源,然后在每个块内匹配可能更好或更安全。它可能更安全的原因是你的源文本可能包含错误,至少在这种情况下你可以检测到它并拥有尽可能多的好数据。

关于你的正则表达的说明。 --与换行符不匹配,因此如果.大括号之间的文字可能有换行符,则需要明确包含换行符。 {color}是一个常见的习惯用法。