正则表达式:如何获取所有字符,直到达到另外两个字符?

时间:2013-02-07 05:09:04

标签: regex regex-negation

我有一个像这样的字符串......

"test_test_test":"Hello \"Hello\" Hello","Oh_yea_oh_yea","Hi there buddy"

我想抓住

"test_test_test":"Hello \"Hello\" Hello"

到目前为止,我的正则表达式是......

"test_test_test":

这会抓住键和冒号。我将永远知道"test_test_test"是什么,我只是不知道结肠后的值是什么。如果我知道报价本身内部没有报价,那就很容易了,但也有。谢谢!

编辑:

里面可以有逗号,并且不能有内部没有转义的引号。

我的想法是......

"test_test_test":"[^(",)]*

在我的脑海中,这说继续直到你发现单引号后跟一个逗号,(“,)然后停止。但是这不起作用。

2 个答案:

答案 0 :(得分:1)

这是RAW正则表达式。如果放入字符串或包含分隔符,则可能需要添加更多转义。

"test_test_test":"(?:[^"\\]|\\[\\"])*"

如果您需要灵活的间距:

"test_test_test" *: *"(?:[^"\\]|\\[\\"])*"

关键部分在于:(?:[^"\\]|\\[\\"])*。它将匹配以下0个或多个:非引号或反斜杠,或转义引用\"或转义反斜杠\\

上面的正则表达式仍然不精确:引用字符串中的内容允许跨越多行。它是否好是取决于引用字符串的语法。但是,我所看到的语言中的多行引用字符串通常不采用我的正则表达式中描述的形式。

正则表达式还将引用的字符串"\n"视为无效。不过,您可以轻松地修改正则表达式以适应这些情况。

答案 1 :(得分:0)

如果我理解正确,你想在逗号之前选择键和第一个条目。

更新

您实际上想要第一个引用的字符串,无论其内容如何。

所以你的正则表达式可能如下所示:/"test_test_test".*?"(?:[^"\\])*"/

更新2:

此正则表达式不会阻塞字符串中的转义:"test_test_test".*?".*[^\\"].*?"(?=,)