Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C#Regex解析多行BBCode_C#_Regex_Multiline_Phpbb_Bbcode - Fatal编程技术网

用C#Regex解析多行BBCode

用C#Regex解析多行BBCode,c#,regex,multiline,phpbb,bbcode,C#,Regex,Multiline,Phpbb,Bbcode,我正在开发一个C#类,用于从PHPBB帖子数据库中提取的文本中解析BBCODE。 在PHPBB上添加了一个自定义BBCode,如下所示: [deck={TEXT1}]{TEXT2}[/deck] [deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne] string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]"; string re

我正在开发一个C#类,用于从PHPBB帖子数据库中提取的文本中解析BBCODE。 在PHPBB上添加了一个自定义BBCode,如下所示:

[deck={TEXT1}]{TEXT2}[/deck]
[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]
string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]";
string replace = "my replacement string";
string pattern = @"\[deck=((.|\n)*?)(?:\s*)\]((.|\n)*?)\[/deck(?:\s*)\]";
RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline;
Regex regex = new Regex(pattern, options);
string result = regex.Replace(text, replace);
它位于数据库中,如下所示:

[deck={TEXT1}]{TEXT2}[/deck]
[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]
string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]";
string replace = "my replacement string";
string pattern = @"\[deck=((.|\n)*?)(?:\s*)\]((.|\n)*?)\[/deck(?:\s*)\]";
RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline;
Regex regex = new Regex(pattern, options);
string result = regex.Replace(text, replace);
我正试图用C#中的正则表达式替换它。 我的C#看起来像这样:

[deck={TEXT1}]{TEXT2}[/deck]
[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]
string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]";
string replace = "my replacement string";
string pattern = @"\[deck=((.|\n)*?)(?:\s*)\]((.|\n)*?)\[/deck(?:\s*)\]";
RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline;
Regex regex = new Regex(pattern, options);
string result = regex.Replace(text, replace);
我很确定这一切都归结于我的正则表达式模式是错误的。这对我来说并不奇怪,因为正则表达式并不是我的强项

提前谢谢。非常感谢您的帮助

编辑:由于有些人觉得不清楚,我将添加更大的示例

原文:

[deck=Foo:13giljne]
    Item #1
    Item #2
    Item #3
    Item #4
[/deck:13giljne]
预期结果:

<span>Foo</span>
<div>
    Item #1
    Item #2
    Item #3
    Item #4
</div>
Foo
项目#1
项目#2
项目#3
项目4

希望这能让我更清楚地了解我在做什么。

如果你想替换
“[deck=FirstText:13giljne]大型多行文本[/deck:13giljne]”
,不要使用正则表达式。使用替换

string result= text.Replace("[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]", replace);

正则表达式通常用于字符串不完全已知,但其结构已知的地方。

如果您不熟悉正则表达式,可以尝试一次匹配一点,以确保字符串匹配。例如,给定字符串:

string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]";
编写与第一部分匹配的表达式:

string firstPart = "\[deck=[^\]]+\]";
[^\]]+
表示,“匹配所有非
]
字符的内容”

验证它是否匹配:

Match m = Regex.Match(text, firstPart);
然后再加上第二部分:

string firstAndSecond = firstPart + "[^\[]*";
并对此进行测试

工作完成后,您可以添加最后一部分:

string search = firstAndSecond + "\[/deck[^\]]\]";
最后一个正则表达式是
(\[deck=[^\]]+\])([^\[]+)(\[/deck[^\]+\]

我对各个部分进行了分组,以便于查看。如果需要,您可以删除这些组,或者将它们设置为非捕获组

编辑:

我从您的编辑中看到,您希望捕获
FirstText
,以及三个组:

string search = "(\[deck=([^:]+):[^\]]+\])([^\[]+)(\[/deck[^\]]+\]";
那么,替换字符串将类似于:

string replace = "<span>$2</span>\n<div>$3</div>";
string replace=“$2\n$3”;

我认为您的正则表达式表明您需要匹配“第一个文本”和“大多行文本”

这应该会有帮助,而且它与您的非常接近。

查看GitHub或Nuget。它不使用正则表达式,但效率更高,速度更快


如果你能再详细说明一下……”我试图用C#中的正则表达式替换它“试图用什么替换什么?”@m0skit0我试图让正则表达式与名为“text”的变量中的字符串匹配,并用名为“replace”的变量中的字符串替换它。但这不是整个字符串吗?为什么不使用替换而不是文本?我不理解您的问题…@m0skit0我只是将这一小部分放入文本中,作为我尝试匹配的字符串的示例。文本的实际值包含我尝试匹配的部分前后的其他文本。该值直接从数据库中提取e、 我试图解析出BBCode并在它们显示之前替换它们。我假设您试图去除
[deck=…]
[/deck…]
标记,并且您只需要BBCode标记之间的文本。对吗?这没有帮助。“FirstText”不是静态值,“:13giljne”不是静态值,且“大多行文字”不是一个静态值。这些都是我无法控制的变量值。这只是我需要匹配的数据库中可能出现的一些情况的一个例子。@m0skit0,嗯,我认为你没有完全理解OP要求的精神。我认为Wayne做得很好,特别是在第一个问题上。好的l那你为什么不回答他呢?:P我不在乎这是否是他/她的第一个问题。他/她应该更好地解释他/她想要什么。句号。不管怎样,祝你好运,韦恩。我会尽量不带责备地说这句话。我不知道你是否花时间在评论界面上,或者读了很多新朋友的问题。不是每个人都能从中受益编程经验丰富。不是每个人都知道我们需要多少细节来恰当地回答问题。你应该注意这是Wayne的第一个问题,因为我们都曾经在那个地方,当我们不知道发生了什么时,必须有人帮助我们。我需要分别将第一部分与
[deck=FirstText:13giljne]
,因为我需要使用
[deck=
:13giljne]
之间的内容。您的最终正则表达式仍然与字符串不匹配。不过,感谢您的帮助。我认为您有一个错误。请将
([^\]+?)
替换为
([^\[]+?)
在试图匹配
大型多行文本的部分中。您正在查找下一个打开的括号内的所有内容,而不是下一个关闭的括号内的所有内容。谢谢Jim。复制粘贴副歌。