gpt4 book ai didi

c++ - 从字符串中删除 BBcode

转载 作者:行者123 更新时间:2023-11-28 07:52:16 26 4
gpt4 key购买 nike

所以看起来这个问题已经被问到太阳下的几乎所有语言......除了 C++。我有一个 XML 文档,在文本节点中存储了一些 bbcode。我正在寻找删除它的最佳方法,我想我会在这里查看是否有人知道一些预构建的库或一些自己完成此操作的有效方法。我正在考虑删除介于“[”和“]”字符之间的任何内容,但是,使用提供给我的 XML 文档这会变得疯狂,因为 BB 的许多实例都采用 '[[blahblahblah]]' 的形式。还有一些'[blahblahblah].'

这是 XML 文档。 <text> 之间的所有数据标签被添加到字符串中,有什么建议吗?

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
<page>
<title>Human Anatomy/Osteology/Axialskeleton</title>
<ns>0</ns>
<id>181313</id>
<revision>
<id>1481605</id>
<parentid>1379871</parentid>
<timestamp>2009-04-26T02:03:12Z</timestamp>
<contributor>
<username>Adrignola</username>
<id>169232</id>
</contributor>
<minor />
<comment>+Category</comment>
<sha1>hvxozde19haz4yhwj73ez82tf2bocbz</sha1>
<text xml:space="preserve"> [[Image:Axial_skeleton_diagram.svg|thumb|240px|right|Diagram of the axial skeleton]]

The Axial Skeleton is a division of the human skeleton and is named because it makes up the longitudinal ''axis'' of the body. It consists of the skull, hyoid bone, vertebral column, sternum and ribs. It is widely accepted to be made up of 80 bones, although this number varies from individual to individual.

[[Category:{{FULLBOOKNAME}}|{{FULLCHAPTERNAME}}]]</text>
</revision>
</page>
<page>
<title>Horn/General/Fingering Chart</title>
<ns>0</ns>
<id>23346</id>
<revision>
<id>1942387</id>
<parentid>1734837</parentid>
<timestamp>2010-10-02T20:21:09Z</timestamp>
<contributor>
<username>Nat682</username>
<id>144010</id>
</contributor>
<comment>added important note</comment>
<sha1>lana7m8m9r23oor0nh24ky45v71sai9</sha1>
<text xml:space="preserve">{{HornNavGeneral}}
The horn spans four plus octaves depending on the player and uses both the treble and bass clefs. In this chart it is assumed the player is using a double-horn with F and Bb sides. The number 1 indicates that the index-finger valve should be depressed, the number 2 indicates that the middle-finger valve should be depressed and the number 3 indicates that the ring-finger valve should be depressed. There are eight possible valve combinations among the first, second and third valves: 0, 1, 2, 3, 1-2, 1-3, 2-3, and 1-2-3. However, there are effectively seven combinations, because 1-2 will produce the same notes, perhaps slightly out of tune, as 3 alone. One depresses the thumb key to use the Bb side of the horn.
[[Image:Fingering chart.png]]
[[Category:Horn]]</text>
</revision>
</page>
</mediawiki>

因此,如果您查看每个 <page> 的底部标签,你会看到像[[Category:{{FULLBOOKNAME}}|{{FULLCHAPTERNAME}}]]这样的东西这就是我要删除的内容。

最佳答案

我假设数据是以您可以读取的迭代器的形式提供给您的。如果您以 std::string 的形式获取它,那么获取一个您可以读取的迭代器非常容易。

在那种情况下,你想要的是一个提升filter_iterator:http://www.boost.org/doc/libs/1_39_0/libs/iterator/doc/filter_iterator.html

你想要的过滤功能很简单。您跟踪看到了多少 [ 并减去看到了多少 ](停在 0 处)。当您的计数为正时,您可以过滤掉该字符。

如果您不能使用 boost,但您是从 std::string 获取它,那么,这有点棘手。但只有一点点。 std::copy_if 有效。

如果您使用的是 C++11,lambda 会让这一切变得非常简单。如果没有,您将不得不编写自己的仿函数来计算 [s.

作为一个简单案例的具体示例:您被输入一个 std::string 并且想要生成一个没有任何 [ ] 分隔内容。

struct SquareBracketStripper
{
enum { open_bracket = '[', close_bracket = ']' };
size_t count;
SquareBracketStripper():count(0) {}
bool operator()(char c)
{
bool skip = (count > 0) || c == open_bracket;
if (c == open_bracket) {
++count;
} else if (c== close_bracket && count > 0) {
--count;
}
return skip;
}
};

std::string FilterBBCode( std::string input ) {
input.erase(input.end(), std::remove_if( input.begin(), input.end(), SquareBracketStripper() ) );
return input;
}

它处理任意深度的嵌套 []

filter_iterator 的帮助在于您永远不必将整个字符串加载到内存中,如果您不知道输入的格式有多么不正确,这将非常有用。不需要将几 TB 的数据从磁盘加载到内存中以过滤掉 [],因为您可以流式传输这些内容并即时进行过滤。但是您的用例可能并不真正关心。

关于c++ - 从字符串中删除 BBcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com