繁体   English   中英

Java 正则表达式非空字符串

[英]Java Regex non-empty string

我想断言该名称不为空。 我正在使用以下正则表达式

"(?s).*?\"name\":\"\\S\".*?"

适用于以下输入:

[{"id": 12,"name":"t","gender":"male"}  (return is not empty)
[{"id": 12,"name":"","gender":"male"}    (return is empty)

当名称包含多个如下字符时不起作用

[{"id": 12,"name":"to","gender":"male"}  (returns is empty)

\\S匹配任何单个非空白字符。 请注意,它也可以匹配"字符,如果键值之间没有空格,则修复这一点很重要。

您可以将\\\\S替换为[^\\\\s\\"]+并将最后的.*?替换为.* (后者是出于性能原因):

String regex = "(?s).*?\"name\":\"[^\\s\"]+\".*";

请参阅正则表达式演示 详情

  • (?s) - 嵌入标志选项等于Pattern.DOTALL
  • .*? - 任何零个或多个字符,尽可能少
  • \\"name\\":\\" - 文字"name":"文本
  • [^\\s"]+ - 除了空格和"之外的一个或多个字符
  • " - 一个"字符
  • .* - 字符串的其余部分(因为.现在匹配任何字符,由于(?s) )。

很明显,您正在使用需要整个字符串匹配的matches().*? 一开始就证明了这一点。 但是,模式开始处的任何点模式都会使匹配变慢,尤其是对于较长的模式(您的不是)和长文本(从探针描述中不清楚)。 通过使用Matcher#find()"name":"[^\\s"]+"模式转向部分匹配是有意义的:

//String text = "[{\"id\": 12,\"name\":\"to\",\"gender\":\"male\"}"; // => There is a match
String text = "[{\"id\": 12,\"name\":\"\",\"gender\":\"male\"}"; // => There is no match
Pattern p = Pattern.compile("\"name\":\"[^\\s\"]+\"");
Matcher m = p.matcher(text);
if (m.find()) {
    System.out.println("There is a match"); 
} else {
    System.out.println("There is no match"); 
}

请参阅Java 演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM