Java 正则表达式 匹配json格式的字符串
目录
语法:
匹配英文字母
要求:
使用.*:
修改:
疑问:
总结:
在处理中,需要替换es查询语句的条件,要匹配json数据格式的字符串
Json数据格式: {"flow_name":"paramName"}
变成字符串后: "{"flow_name":"paramName"}"
注意: 处理的时候,注意双引号的处理。
语法:
[abc] 表示字母abc中的任意一个
数量控制符
贪婪型
? 表示1个或0个。换句话说,表示要不然没有,要不然只有1个
* 表示0个或多个。
+ 表示1个或多个。
{n} 表示正好n个
{n,m} 表示n到m个,这是一个左闭右闭区间
{n,} 表示至少n个
匹配英文字母
要求:
如何把
{"bool":{"must":[{"match":{"flow_name":"paramName"}}],"must_not":[{"term":{"reasonCode":157}}]}}
转换为:
匹配字符串里面:{"flow_name":"paramName"} 和 {"reasonCode":157}等
使用.*:
1
2Json中 key-value中,value的值可能没有双引用 pattern = "\{"([a-zA-Z_]+)":(.+)}";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public static void main(String[] args) { String content = "{"bool":{"must":[{"match":{"flowname":"$param.paramName"}}],"must_not":[{"term":{"reasonCode":"157"}}]}}"; String pattern = "\{"([a-zA-Z_]+)":(.+)}"; matchJson(content, pattern); } public static void matchJson(String content, String pattern) { Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(content); while (m.find()) { String group = m.group(); System.out.println("group: "+group); System.out.println("group1: "+m.group(1)); System.out.println("group2: "+m.group(2)); } }
部分结果:
1
2
3
4group: {"bool":{"must":[{"match":{"flowname":"$param.paramName"}}],"must_not":[{"term":{"reasonCode":"157"}}]}} group1: bool group2: {"must":[{"match":{"flowname":"$param.paramName"}}],"must_not":[{"term":{"reasonCode":"157"}}]}
如果使用(.*)会变成全匹配,不符合要求,还是要改成具体的详细的内容
修改:
pattern = "\{"([a-zA-Z_]*)":"([a-zA-Z0-9._$]*)"}";
1
2
3
4
5
6public static void main(String[] args) { String content = "{"bool":{"must":[{"match":{"flowname":"$param.paramName"}}],"must_not":[{"term":{"reasonCode":"157"}}]}}"; String pattern = "\{"([a-zA-Z_]+)":(.+)}"; pattern = "\{"([a-zA-Z_]*)":"([a-zA-Z0-9._$]*)"}"; matchJson(content, pattern); }
结果:
1
2
3
4
5
6
7group: {"flowname":"$param.paramName"} group1: flowname group2: $param.paramName group: {"reasonCode":"157"} group1: reasonCode group2: 157
疑问:
String content = "{"bool":{"must":[{"match":{"flow_name":"paramName"}}],"must_not":[{"term":{"reasonCode":157}}]}}";
如果字符串中,{"reasonCode":157} 这时候该如何处理呢?如何更通用些?
把双引号,放到匹配里面
pattern = "\{"([a-zA-Z_]*)":([a-zA-Z0-9._$""]*)}";
结果:
1
2
3
4
5
6
7group: {"flowname":"$param.paramName"} group1: flowname group2: "$param.paramName" group: {"reasonCode":157} group1: reasonCode group2: 157
这样可以匹配到内容,但是带双引号的内容,匹配到的时候也带有了双引号,入:"$param.paramName",处理匹配的时候,要特殊处理,不算好,目前也没有想到好的方式去处理。具体根据实际情况去优化处理吧。
总结:
匹配json格式字符串的时候,特别注意双引号的处理,其它根据实际情况去写pattern,有耐心,先从简单的开始匹配,比如先写匹配key,然后写匹配value,再组合写匹配key-value,这样更能发现问题。
最后
以上就是心灵美季节最近收集整理的关于Java 正则表达式 匹配json格式的字符串语法:匹配英文字母总结:的全部内容,更多相关Java内容请搜索靠谱客的其他文章。
发表评论 取消回复