【问题标题】:Regular expression for parsing用于解析的正则表达式
【发布时间】:2012-10-30 23:02:55
【问题描述】:

我正在寻找一个正则表达式来转换类似的东西

{test}hello world{/test} and {again}i'm coming back{/again} in hello world i'm coming back. 

我尝试了{[^}]+},但使用这个正则表达式,我不能只拥有测试中的内容和再次标记。有没有办法完成这个正则表达式?

【问题讨论】:

  • 正则表达式只匹配模式。它不会改变字符串。您喜欢使用哪种语言?

标签: objective-c regex nsregularexpression


【解决方案1】:

正确执行此操作通常超出了正则表达式的能力。但是,如果您可以保证这些标签永远不会嵌套,并且您的输入永远不会包含不表示标签的花括号,那么这个正则表达式可以进行匹配:

\{([^}]+)}(.*?)\{/\1}

解释:

\{        # a literal {
(         # capture the tag name
[^}]+)    # everything until the end of the tag (you already had this)
}         # a literal }
(         # capture the tag's value
.*?)      # any characters, but as few as possible to complete the match
          # note that the ? makes the repetition ungreedy, which is important if
          # you have the same tag twice or more in a string
\{        # a literal {
\1        # use the tag's name again (capture no. 1)
}         # a literal }

所以这使用反向引用\1 来确保结束标记包含与开始标记相同的单词。然后您将在捕获1 中找到标签的名称,并在捕获2 中找到标签的值/内容。从这里您可以随心所欲地处理这些(例如,将这些值重新组合在一起)。

请注意,如果您希望标签跨越多行,则应使用SINGLELINEDOTALL 选项。

【讨论】:

  • 事实上,我正在使用这个正则表达式来获取 HTML 代码中 和 HTML 标记之间的所有文本。我试图用 替换 { 和 } 但它不起作用.. 一个想法?
  • @seb 您的标签是否包含属性?您使用SINGLELINEDOTALL 选项吗(我不知道如何在Objective C 中设置,抱歉)。另外,如果您要解析 HTML,改用 DOM 解析器。
  • 是的,我的标签有时包含属性。
  • 嗯,这与你的问题有很大不同(因为这个正则表达式也会尝试在结束标签中找到所有这些属性)。您可能正在寻找这样的东西,然后:<([^\s>]+)[^>]*>(.*?)</\1>。但是,请查看一些 DOM 解析器。
猜你喜欢
  • 2022-01-25
  • 2013-12-31
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多