正则表达式:如何处理空引号

时间:2015-12-13 03:42:45

标签: java regex string escaping

我有一个具有以下模式的字符串:

"123 456 789 \"abc def\" \"ghi\" \"jkl\" \"mno\" \"pqr\" stu v 097 \"wx yz\""

我想以一种方式拆分这个字符串,使用" "引号内部的引号用引号分开。我为此目的使用的正则表达式是:

"(['\"])((?:\\\\\\1|.)+?)\\1|([^\\s\"']+)"

生成的输出是:

123, 456, 789, "abc def", "ghi", "jkl", "mno", "pqr", stu, v, 097, "wx yz"

这个输出很好,但问题是如果我有一个空引号,正则表达式会混淆输出。例如,让我们从上面的输入字符串中删除pqr。

"123 456 789 \"abc def\" \"ghi\" \"jkl\" \"mno\" \"\" stu v 097 \"wx yz\""

这种情况下的输出是:

123, 456, 789, "abc def", "ghi", "jkl", "mno", "" stu v 097 ", wx, yz

主要问题是"" stu v 097 "。所需的输出是:

123, 456, 789, "abc def", "ghi", "jkl", "mno", "", stu, v, 097, "wx yz"

如何通过修改正则表达式处理空字符串?

3 个答案:

答案 0 :(得分:2)

这个正则表达式似乎对我有用:

(?:(['"]).*?\1)|(?:[^\s"']+)

作为Java字符串,它是:

"(?:(['\"]).*?\\1)|(?:[^\\s\"']+)"

您可以看到它匹配的内容here,只需点击Java即可。

答案 1 :(得分:0)

你的表情是对的。要获得所需的输出,只需替换+上的*

(['"])((?:\\\1|.)*?)\1|([^\s"']+)

注意,+表示一次或多次。但你可以得到像“”这样的空引号。所以我们需要零或更多次 - *

答案 2 :(得分:0)

昨天我正在考虑你的问题。我想出了这个。这似乎是另一种方式。或者可能不是!

((\"[\w\s]*\")|(\d+|\w+))

作为java String。

((\"[\\w\\s]*\")|(\\d+|\\w+))