正则表达式用尖括号替换方括号

时间:2009-11-28 08:19:19

标签: c# regex

我有一个字符串:

[a b="c" d="e"]Some multi line text[/a]

现在部分d="e"是可选的。我想将这种类型的字符串转换为:

<a b="c" d="e">Some multi line text</a>

a bd的值是不变的,所以我不需要捕捉它们。我只需要cetext between the tags的值,并创建一个基于xml的等效表达式。那么怎么做呢,因为还有一些可选部分。

3 个答案:

答案 0 :(得分:0)

如果您实际上正在考虑使用正则表达式处理(伪)-HTML,

<强>不

SO充满了针对HTML / XML提出正则表达式的帖子,以及指出为什么这是一个坏主意的答案。

假设你的多行文字(“可以是任何东西”)包含

[a b="foo" [a b="bar"]]

正则表达式无法检测到这一点。

请参阅以下经典答案: RegEx match open tags except XHTML self-contained tags

有:

  

我觉得是时候退出了   助理的帖子不要解析HTML   有正则表达官。无论多少   我们说的时候,他们不会停止   每天都来......甚至每小时一次。   这是一个失败的原因,其他人   可以争取一点。所以继续,解析   如果必须,使用正则表达式的HTML。它的   只有破碎的代码,而不是生死。    - bobince

严重。查找XML或HTML DOM并使用您的数据填充它。然后序列化它。这将解决你甚至不知道的所有问题。

答案 1 :(得分:0)

some multiline text会包含[]吗?如果没有,您只需使用[替换<,使用]替换>使用string.replace - 不需要正则表达式。

更新: 如果它可以是[/a]以外的任何内容,则可以替换

^\[a([^\]]+)](.*?)\[/a]$

<a$1>$2</a>

我没有在正则表达式中转义]/ - 如果有必要,请逃避它们

^\[a([^\]]+)\](.*?)\[\/a\]$

答案 2 :(得分:0)

对于HTML标记,请使用HTML解析器。

对于[a] [/ a],您可以执行以下操作

Match m=Regex.Match(@"[a b=""c"" d=""e""]Some multi line text[/a]", 
                    @"\[a b=""([^""]+)"" d=""([^""]+)""\](.*?)\[/a\]",
                    RegexOptions.Multiline);

m.Groups[1].Value
"c"
m.Groups[2].Value
"e"
m.Groups[3].Value
"Some multi line text"

这是Regex.Replace(虽然我不喜欢)

string inputStr = @"[a b=""[[[[c]]]]"" d=""e[]""]Some multi line text[/a]";
string resultStr=Regex.Replace(inputStr,
                            @"\[a( b=""[^""]+"")( d=""[^""]+"")?\](.*?)\[/a\]",
                            @"<a$1$2>$3</a>", 
                            RegexOptions.Multiline);