【问题标题】:Regular Expression Needed for XML DocumentXML 文档所需的正则表达式
【发布时间】:2011-12-27 00:41:36
【问题描述】:

需要单个正则表达式来查找

  1. 双空格
  2. 标签
  3. 额外输入(换行/回车)
  4. 标签之间换行
  5. 结束标签前后的空格

在 XML 文档中。

【问题讨论】:

  • 我对正则表达式不太了解..请帮我处理一下紧急情况.. 对于双空格 n 选项卡,我放了 "( )|\t"

标签: c++ visual-c++ mfc


【解决方案1】:

一般来说,您需要一个 xml 解析器来处理 xml 文档。 Regular expressions are not powerful enough to handle all cases.

对正则表达式使用 perl 语法:

m{
  [ ][ ]  # double spaces
  |
  \t    # tab
  |    
  $\s*$  # extra enter separated only by whitespace. Note: requires `m` flag
  |  
  # XXX: it works only on simple xml
  <[^<>]*$[^<>]*> # line break inside tag
  |
  # XXX: it works only on simple xml
  [ ]</[^<>]+> |
  </[^<>]+>[ ] # space after/before closing tag
}mxg;

demo

【讨论】:

  • 我在 Visual Studio 中使用 C++ 工作。假设 是一个包含换行符的标签。将 ]*\s+$[^]*>为那个标签工作.. ?
  • @Chetan Patil:you can try it。如果您删除 \s+,它匹配。我已经编辑了答案。
  • 感谢您的帮助。但我想在标签内找到 \n 以及在 \n. 等开始和结束标签之间找到
  • @Chetan Patil:这是regex to find \n inside tag and also between opening and closing tag。它适用于 xml 文档的 small 子集(文本中的 don't have &lt;&gt; in attributes&lt;。我什至没有提到 cmets、CDATA)。
  • :非常感谢您的帮助。现在最后一个问题:D 什么是 $,我可以用 \n 代替 $ 吗?
【解决方案2】:

很抱歉,这不会是一个很大的答案,但也许我可以提供一点帮助。现在对于步骤 1、2 和 3,这样匹配并不难

标签是\t

新行是 \r 或 \n

空白(空格、制表符或换行符)是 \s

所以 1 个标签:(\t) 两个空格 = (\s\s) 或 (\s{2}) 一个额外的行通常由连续的两个换行符找到,但有时它们可​​以用空格分隔,所以要小心... (\r\s*\r)|(\n\s*\n)

总而言之,步骤 1/2/3 是捕获组:

  (\r\s*\r)|(\n\s*\n)|(\t)|(\s{2})

但是 4 和 5 呢?

如果 或者不是文档结构的一部分,它们都需要能够在正则表达式中回溯。这可能发生在无效的 XML 或 CDATA 部分等中。它变得复杂,但可以使用递归正则表达式来完成。但是我不知道支持递归的 c++ 中的正则表达式库。很抱歉,但手动解析字符串数据可能会容易得多。

现在一些正则表达式方言不同,所以你的里程可能会有所不同。供参考,虽然我倾向于使用 http://www.regular-expressions.info/quickstart.html

【讨论】:

  • thnx 寻求帮助,但它只是找到我正在为 xml 文档创建日志的选项卡,它会出现上述所有错误。
  • 对于双倍空格和制表符,我使用 "()|\t" 对于其他我不知道。额外的输入是在 \n 之后找到 \n。所以你能告诉我吗?跨度>
猜你喜欢
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
相关资源
最近更新 更多