我有一个具有以下模式的字符串:
"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"
如何通过修改正则表达式处理空字符串?
答案 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+))