【问题标题】:Regular Expression match text within brakets: [[text]]正则表达式匹配括号内的文本:[[text]]
【发布时间】:2011-12-14 01:38:33
【问题描述】:

我正在尝试编写一个可以在 c# 中工作的正则表达式,它会匹配以下行中的某些内容

[[text is here]]

[[]] 之间几乎可以有任何东西。

唯一的规则是,如果出现[], 连续永远不能超过 1 个。

例如

[[ text ] is here ]] is a match
[[ text [ is ]here [ ]] is a match
[[ text ][ is [] ]] is a match

[[ text [[ is here]] is NOT a match.

我已经摸不着头脑了好几个小时了,我想出的最接近的是

@"\[\[[^\[]+(\]\])+?"

上面会匹配

[[text is ] here]]

but not

[[text is [ here]]

任何帮助/见解将不胜感激。

【问题讨论】:

  • 我怀疑一个正则表达式会在这里减少芥末,但是一个简单的解析器很容易编写。
  • 我同意马特的观点。抛弃 RegEx 就在这里。这将非常复杂,每次您想要更改它时,您都必须重新考虑它。一个简单的 for 循环遍历字符串的每个字符将更容易理解、更改并且计算速度更快。

标签: c# .net regex expression


【解决方案1】:
\[\[(?:[^\[\]]|\][^\]]|\[[^[])*\]\]

扩展:

\[\[           # match the [[
(?:            # and then match zero or more...
   [^\[\]]     #   character which is not [ or ], or
|  \][^\]]     #   a ], followed by a non-], or
|  \[[^[]      #   a [, followed by a non-[
)*
\]\]           # and match the ]]

请注意,这将匹配 [[ text [[ is here]] is NOT a match.[[ is here]]

【讨论】:

  • 这会返回对字符串“[[ text [[ is here]]”的部分匹配,根据要求不应该是匹配。匹配字符串“[[ is here]]”。
  • @jmacinnes:如果需要完全匹配,那么只需将 ^...$ 粘贴到正则表达式即可。
  • 这肯定会起作用,但它确实假设要匹配的文本没有嵌入到其他文本中,问题既没有确认也没有否认。
  • 更正! +1 我只想补充一点,通过 "unrolling-the-loop" 可以提高效率,如下所示:\[\[[^\[\]]*(?:(?:\][^\]]|\[[^[])[^\[\]]*)*\]\]
【解决方案2】:

如果我正确理解您的问题,您需要将其分解为两个正则表达式,一个测试[[ ]] 部分,另一个寻找连续两个的“坏”条件。 “匹配”是匹配第一个而不是第二个。

编辑或使用 KennyTM 的卓越解决方案

【讨论】:

    【解决方案3】:

    你需要积极地向前看,向后看。

    (?<=\[\[).*?(?=\]\])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 2011-07-18
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多