【问题标题】:Need to extract substrings based on key words需要根据关键词提取子串
【发布时间】:2015-08-14 16:36:55
【问题描述】:

我有一个字符串(来自肥皂的 cdata 块),大致如下:

     "<![CDATA[XXX|^~\&
      KEY|^~\&|xxxxx|xxxxx^xxxx xxxxx 
      INFO||xxx|xxxxxx||xxxxx|xxxxxxx|xxxxxxx 
      INFO|||xxxxx||||xxxxxxxxx||||||||||xxxxxxxx              
      KEY|^~\&|xxxxxx|xxxxxxxxxx|xxxxxxxx    
      INFO||xx|xxxxxxxx||xxxxxxx|xxxxxx 
      INFO|||xxxx|x|||xxxxxxxxx|||||||x|||xxxxx|||xxxx||||||||||||||||||||||||xxxx
      KEY|^~\&|xxxxx|xxxxx^xxxx xxxxx 
      INFO||xxx|xxxxxx||xxxxx|xxxxxxx|xxxxxxx 
      INFO|||xxxxx||||xxxxxxxxx||||||||||xxxxxxxx  ]]>"

我试图弄清楚如何使用 ruby​​ 安全地解析出每个“KEY”部分的字符串。基本上我需要一个看起来像这样的刺痛:

  "KEY|^~\&|xxxxx|xxxxx^xxxx xxxxx 
  INFO||xxx|xxxxxx||xxxxx|xxxxxxx|xxxxxxx 
  INFO|||xxxxx||||xxxxxxxxx||||||||||xxxxxxxx"

每次都有一个“KEY”。关于解决此问题的最佳方法的想法?谢谢。

【问题讨论】:

  • 我对肥皂一无所知,所以如果这无关紧要,我很抱歉,但我建议使用soap library
  • 是的,我猜肥皂部分是无关紧要的,我只是提到以防有人可能以前看到过这种类型的响应。这真的是一个红宝石问题。此时只是一个字符串。感谢您的回复。
  • 我相信您不会反对我刚刚所做的编辑。通常,我会建议在评论中进行更改,但我不知道您什么时候回来,并且担心不熟悉“cdata”的读者会跳过您的问题。 (我正要这样做。)如您所见,我删除了标题中对“cdata”和“XML”的引用,并删除了关键字“soap”和“cdata”。

标签: ruby regex string parsing


【解决方案1】:

这是一种方法(带有一个简化的示例):

str = 
"<![CDATA[XXX|^~\&
KEY|^~\&|x
INFO||x
INFO|||x
KEY|^~\&|x
INFO||xx|x
INFO|||x
KEY|^~\&|x
INFO||x
INFO|||x"

r = /
    ^KEY\b         # match KEY at beginning of line followed by word boundary
    .+?            # match any number of any character, lazily
    (?=\bKEY\b|\z) # match KEY bracketed by word boundaries or end of
                   # string, in positive lookahead
    /mx            # multiline and extended modes

str.scan r
  #=> ["KEY|^~&|x\nINFO||x\nINFO|||x\n",
  #    "KEY|^~&|x\nINFO||xx|x\nINFO|||x\n",
  #    "KEY|^~&|x\nINFO||x\nINFO|||x"] 

【讨论】:

  • 您可能想删除您的评论,因为它适用于我随后更改的初始答案,因此可能会造成混淆。
  • 接受这个答案,因为它回答了我原来的问题并且完美运行。抱歉,我是 Stack Overflow 的新手,感谢您的编辑。但是,如果我可以再问一件事:这仅在“KEY”位于新行时才有效。我收到的是一团糟,我一开始就用正则表达式很糟糕。是否可以对上述代码进行编辑以获取“KEY”部分,无论它位于何处?
  • 如果"KEY" 不一定在行首,只需将^ 替换为\b(分词)即可。这假设子字符串在下一个 \bKEY\b (或字符串的结尾)之前结束。那是对的吗?请注意,"INFO" 没有出现在我的正则表达式中。可以吗?
  • 做到了!非常感谢。如果可以的话,我会投票。
【解决方案2】:

不像正则表达式那样轻松,但这可能对你有用:

KEY(.+\n)+(?=\s+KEY)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2019-11-09
    相关资源
    最近更新 更多