【发布时间】:2011-12-27 00:41:36
【问题描述】:
需要单个正则表达式来查找
- 双空格
- 标签
- 额外输入(换行/回车)
- 标签之间换行
- 结束标签前后的空格
在 XML 文档中。
【问题讨论】:
-
我对正则表达式不太了解..请帮我处理一下紧急情况.. 对于双空格 n 选项卡,我放了 "( )|\t"
标签: c++ visual-c++ mfc
需要单个正则表达式来查找
在 XML 文档中。
【问题讨论】:
标签: c++ visual-c++ mfc
一般来说,您需要一个 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;
【讨论】:
\s+,它匹配。我已经编辑了答案。
<> in attributes 和 <。我什至没有提到 cmets、CDATA)。
很抱歉,这不会是一个很大的答案,但也许我可以提供一点帮助。现在对于步骤 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
【讨论】: