如何避免使用正则表达式将字符串括在双引号中?

时间:2019-01-05 18:21:13

标签: java regex

我在Java中使用正则表达式来获取除双引号和该字符串的双引号内的字符串之外的所有字符串:

"Lorem ipsum mauris "libero" non "pulvinar" suscipit, nis "aenean" 
curae odio lobortis "nulla" suspendisse"

我可以使用以下命令获取包含在双引号中的字符串:

((\")(\S+)(\"))

结果:
"libero","pulvinar","aenean"
与我想要的相反
但是当我尝试取消模式:
[^((\")(\S+)(\"))]
时,没有用双引号引起来的字符串没有针对性:

这是我想要的:

"Lorem ","ipsum","mauris","non","suscipit",",","nis","curae",
"odio","lobortis", "suspendiss"


任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

字符类只能取反单个字符,不能像您尝试的那样取反模式。

您可以使用此正则表达式使用环顾四周拒绝双引号引起来的字符串,

(?!<")\b\w+\b(?!")

此处的单词边界\b确保不应将部分单词检测为匹配项。例如在单词"libero"中,如果我们不将\b放在正则表达式周围,那么它可能会从该单词的中间检测到iber作为匹配项。

Demo

相同的Java代码是

String s = "Lorem ipsum mauris \"libero\" non \"pulvinar\" suscipit, nis \"aenean\" curae odio lobortis \"nulla\" suspendisse";
Pattern p = Pattern.compile("(?!<\")\\b\\w+\\b(?!\")");
Matcher m = p.matcher(s);

while (m.find()) {
    System.out.println(m.group());
}

哪些印刷品

Lorem
ipsum
mauris
non
suscipit
nis
curae
odio
lobortis
suspendisse

编辑:

我意识到您还希望将逗号,作为匹配的字符串,因此在这种情况下,您可以对正则表达式进行一些更改以这样表示,

(?!<")\b\w+\b(?!")|,

尽管,现在我猜想您的字符串可能除了逗号以外还具有其他特殊字符,在这种情况下,您可以使用像[,.!;]这样的字符类,而不仅仅是逗号。同样取决于您要如何对这些字符进行分组,是像,;!(然后使用[,.!;]+)那样连续连续一次,还是分别使用每个特殊字符,然后只保留字符类。