![](/img/trans.png)
[英]Java Regex - verify if string contains non-empty trimmed tokens separated by a period (.)
[英]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.