3

我有一个这样的文本块。

google.sbox.p50 && google.sbox.p50(["如何",[["如何打领带",0],["如何训练你的龙2预告片",0],["怎么做杯歌",0],["如何3分钟搞定六包",0],["如何制作能发射的纸枪",0],["如何基础",0],[ "如何爱小韦恩",0],["如何像你最喜欢的艺术家一样唱歌",0],["如何成为令人心碎的码头和钻石",0],["如何在我的世界中驯服一匹马",0]],{"q":"XJW--0IKH6sqOp0ME-x5B7b_5wY","j":"5","k":1}])

使用\\[([^]]+)\\]我能够得到我需要的一切,但有一点我没有。我不需要["how to",[[. 我只需要格式如下的块,

["how to tie a tie",0]

有人可以帮我修改我的表达方式以只得到我需要的吗?我已经做了几个小时了,我无法理解 RegEx 的概念。

4

5 回答 5

3

将左方括号和右方括号都放在否定字符类中?

\\[([^][]+)\\]

\\[匹配文字[

\\]匹配文字]

[^][]是一个否定类,例如匹配除 . 之外的任何字符][。看到它可能有点困难,但它相当于[^\\]\\[]. 这里不需要双重转义,因为您使用的是字符类(就像\\.等效于[.]

([^][]+)捕获方括号内的所有内容,确保没有][在里面。

在 C# 中,您可以使用该@符号来避免每次都必须双重转义,并使用它使正则表达式如下所示:

var regex = new Regex(@"\[([^][]+)\]");

注意:此正则表达式将捕获方括号内的所有内容。如果你想具体得到格式["how to tie a tie",0],你可以更精确。毕竟,正则表达式只会匹配你让它匹配的东西:

var regex = new Regex(@"\["[^"]+",0\]");

在这里,我们有另一个否定字符类:[^"]. 这将匹配任何不是引号字符的字符。

0如示例文本块中所述,此假设始终为 数字。如果您有多种数字的可能性,您可以使用字符类[0-9]+

var regex = new Regex(@"\["[^"]+",[0-9]+\]");

您也可以使用\d+,但是这个字符类也匹配其他可能会或可能不会使正则表达式变得更糟的字符。如果您想通过在字符之间允许可能的空格、制表符、换行符、换页来更加谨慎,您可以使用这个正则表达式:

var regex = new Regex(@"\[\s*"[^"]+"\s*,\s*[0-9]+\s*\]");

结论,可能有许多适合您需要的正则表达式,只要确保您知道您的数据是如何通过的,这样您就可以选择一个具有适量高速公路的正则表达式。

于 2013-08-29T19:15:59.433 回答
1

我认为这是您正在寻找的与以下格式匹配的内容["how to tie a tie",0]

(\["[^"]+",\d\])

( )- 围绕整个事物,以便将所有内容都捕获在该组中
\["- 查找["
[^"]+- 查找任何内容中的一个或多个,除了"
",- 查找",
\d- 查找一个数字,如果您想要的不仅仅是一个数字,请执行\d+
\]- 匹配结尾]

此正则表达式中唯一可变的内容是引号 ( [^"]+) 和数字 ( \d+) 中的内容。

演示

如果您不希望捕获组中的方括号,您可以这样做:

\[("[^"]+",\d+)\]

如果您的引号中有引号,我假设您不想匹配,因为它可能会破坏您使用它的任何目的,但如果您这样做,这应该有效:

\[("[^[\]]+",\d+)\]
于 2013-08-29T19:20:59.230 回答
0

您必须使用此模式

@"\[[^][]+\]"

更多关于方括号的信息在这里

于 2013-08-29T19:20:52.570 回答
0

我想你需要这个:(\[[^\[^]+?])

你做错了什么?(最小匹配)并排除任何[]

于 2013-08-29T19:24:55.247 回答
0

看起来外括号中的文本是JSON对象的表示。而不是正则表达式,我只是:

  1. 去掉括号前的东西 + 第一个括号 ( google.sbox.p50 && google.sbox.p50() 加上去掉尾括号)。有更多的方法可以做到这一点,它可以比正则表达式更有效。
  2. JSON解析剩余的内部部分。
  3. 从那时起,您就拥有了对象表示,您可以省略不需要的数组的第一个元素,此外,您还拥有可遍历形式的所有其他元素。

无论如何,最后都有会话信息以及参数(在 {} 括号中),所以最后你可能最终还是要解析东西。最好不要重新发明轮子(JSON解析)。

于 2013-08-29T19:54:50.757 回答