【问题标题】:Regular expression to replace square brackets with angle brackets正则表达式用尖括号替换方括号
【发布时间】:2009-11-28 08:19:19
【问题描述】:

我有一个类似的字符串:

[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 的表达式。那么怎么做呢,因为还有一些可选的部分。

【问题讨论】:

  • 我想可能会有这样的情况:[a b="&lt;c&gt;" d="e"]Some &lt;element&gt;here&lt;/element&gt; too[/a] ?
  • [a..]..[/a] 之间可以有任何东西
  • 如果“任何东西都可以在 [a..]..[/a] 之间”,那么您将生成一个无限大的正则表达式,它将被无限破坏
  • 我不认为,因为文本中不会有任何[/a],即使它存在我也需要匹配第一个结尾[/a]
  • 您说过“文本可以是任何东西”和“本身不能有 HTML 标记或脚本”。所以你有一个未定义/矛盾的问题,不可能写一个正则表达式。只有您知道语法(如果有的话)适用于您的多行上下文。只有您可以编写解析器。并且正则表达式几乎肯定会导致问题

标签: c# regex


【解决方案1】:

对于 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);

【讨论】:

  • 首先我不是在解析 HTML,它的文本带有一些需要转换为 XML 的标签。其次,有没有像使用 Regex.Replace 函数这样的直接方法
  • 您错过了问题:d="e" 部分是可选的。我猜你的 Regex.Replace 不起作用。
  • 如果 $2 不包含任何内容,则输出中不应为 d="$2"。
  • 虽然答案不是我想要的,因为它匹配所有内容而不仅仅是属性值。我想通了,最好是在 Regex.Replace 方法中使用 Match 和 MatchEvaluator Delegate。接受您的回答,因为它是最有帮助的。
【解决方案2】:

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

不要

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

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

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

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

查看经典答案: RegEx match open tags except XHTML self-contained tags

其中有:

我认为是时候退出 助理不要解析 HTML 的帖子 与正则表达式官员。不管有多少 我们说的时候,他们不会停止 每天都来……甚至每小时。 这是一个失败的事业,其他人 可以争取一下。所以继续,解析 带有正则表达式的 HTML,如果必须的话。它是 只有破代码,没有生死。 – 弹跳

说真的。找到一个 XML 或 HTML DOM 并用您的数据填充它。然后序列化它。这将解决您甚至不知道自己遇到的所有问题。

【讨论】:

  • 第一种情况:不是那么简单的[也可以在文本之间,所以你这样做。
  • 第二种情况:我不是在解析XML,而是将文本中的一些标签转换为类似XML的语法。
  • 但是你可以在内容中包含“任何东西”。这可能包括标点符号,包括 HTML 标记、HTML 的 sn-ps 等。您将遇到与使用正则表达式解析 XHTML 或 XML 相同的问题。
  • 我已经删除了我的琐碎解决方案,因为 OP 现在明确表示正则表达式必须处理任意复杂的内容。
  • 其他部分已经处理好了。您再次感到困惑,我没有解析 HTML,并且本身不能有 HTML 标记或脚本。它是我需要将其转换为 XML 的文本,例如将文本转换为 SSML,这就是为什么我们首先没有 的原因,而是我们有自己的文本符号来标记文本部分 [a b="c" d="e"]
【解决方案3】:

some multiline text 是否会包括[]?如果没有,您可以使用 string.replace 将 [ 替换为 &lt; 并将 ] 替换为 &gt; - 无需正则表达式。

更新: 如果不是[/a],则可以替换

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

<a$1>$2</a>

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

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

【讨论】:

  • 多行文字可以是任何东西。
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2020-01-07
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多