如何正则表达两组数据

时间:2014-10-05 02:47:58

标签: ruby regex parsing

我的文字包含我的数据描述,并以两组数据结束:

LONG TEXT - TAGS:(Array of TAGS) - URL

我需要解析这个文本并构建我的数据。

我的想法是拥有类似的东西:

a="LONG TEXT. Tags:[ex1,ex2,ex3]"

并使用a = a.partition("Tags:")partition拆分arg上的文字),这样我就可以获得a[0]上的长文本和a[2]上的标记,然后我将其拆分为获取所有单个标签。如果"Tags:"位于LONG TEXT,则可能会出现此问题,但我可以Tags:使其唯一,以使其有效。

我在如何存储网址时遇到问题。我猜测在URL上对字符串进行分区也可以起作用,但我相信在正则表达式中有更好的方法可以更好地处理数据。我应该如何构建我的数据,以便在存储在文本中时检索它们?

更新:我可以告诉我的用户以某种方式构建他们的数据,但它需要很容易。对于输出,我只需要文本,字符串数组和URL。

例如,我可以告诉我的用户输入:

"This is a long text, which is the original description which I have to get and 
store as text in my database.

TAGS:[Tag1,Tag 2]
URL:http://google.com"

或者我可以告诉他们将其结构化为YAML格式。但我的目标是简单。

如果说我使用上面的输入,那么正则表达式的最佳方法是什么:

"This is a long text, which is the original description which I have to get and 
store as text in my database."

array of "Tag1", "Tag 2"

"http://google.com"

1 个答案:

答案 0 :(得分:1)

TL; DR

最好的要做的就是给用户一个简单(但评论很好)的模板,他们可以编辑这些模板,并让他们将YAML粘贴到自由格式中文本域。 YAML非常人性化,可以手工编辑。然后可以将YAML轻松解析为Hash,以便在您的应用程序中使用。

样本YAML模板

以下是YAML标记的基本示例,其中 description 标记 url 定义为哈希键。您可以看到用户修改是多么容易,只要他们注意缩进连续的行。

:description: This is a long text, which is the original description
  which I have to get and store as text in my database.
:tags:
  - tag1
  - tag2
  - tag3
:url: http://example.com

请注意,标记的数组数据是为了便于阅读而缩进的。但是,如果标签在这种特殊情况下没有缩进,那么Ruby的YAML解析器会同样高兴。

您还可以在文本模板中自由使用注释,以提供YAML格式帮助,或记录有效的键或值。例如:

# Make sure to indent descriptions longer than one line!
:description: This is a long text, which is the original description
  which I have to get and store as text in my database.
# Valid tag names include tag1..tag9, and the word "quux."
:tags:
  - tag1
  - tag2
  - tag3
# Use a full URI with scheme, and not just a domain name.
:url: http://example.com

解析YAML

使用YAML#loadYAML#load_file将YAML解析为Ruby对象。例如:

require 'yaml'

data1 = YAML.load string_or_here_document
data2 = YAML.load_file '/path/to/yaml/file'

YAML输入解析为Ruby Hash

鉴于上面的YAML,在正确解析输入字符串或文件后,您将获得以下Hash对象:

{:description=>
  "This is a long text, which is the original description which I have to get and store as text in my database.",
 :tags=>["tag1", "tag2", "tag3"],
 :url=>"http://example.com"}

然后,您可以像任何其他Hash对象一样访问这些值。例如:

data1[:url]
#=> "http://example.com"

data2[:tags]
#=> ["tag1", "tag2", "tag3"]