我想将我的笨拙逻辑替换为正则表达式解决方案。我的解决方案有效,但它非常冗余。
我必须处理 JSON 数据:
{"动作":"停止"}
仅作为结果 - <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="styles.css"/>
</head>
<body>
<div class="wrapper">
<div class="header">
<h1 class="logo">Simply Expense</h1>
<nav class="navbar">
<ul>
<li><a href="#">Expenses</a></li>
<li><a href="#">Receipts</a></li>
<li><a href="#">Reports</a></li>
</ul>
</nav>
<div class="search">
<button>test</button>
<input type="text">
</div>
</div>
</div>
</body>
</html>
。
这是我的解决方案:
stop
我想知道如何用Regex解决这个任务。
如何使用正则表达式解决方案重构此逻辑?
答案 0 :(得分:1)
只要您以下列格式处理JSON数据:
{"something1":"something2"}
你总是想要something2
这是一个简单的一行非regex
方式和regex
方式
public static void main(String[] args) {
System.out.println(processAction("{\"action\":\"stop\"}"));
System.out.println(processActionRegex("{\"action\":\"go\"}"));
}
private static String processAction(String actionJson) {
return actionJson.substring(actionJson.indexOf(":\"") + 2, actionJson.lastIndexOf("\""));
}
private static String processActionRegex(String actionJson) {
Pattern pattern = Pattern.compile("\\{\"(\\w+)\":\"(\\w+)\"\\}");
Matcher matcher = pattern.matcher(actionJson);
String result = "";
if (matcher.matches()) {
result = matcher.group(2);
} else {
// Throw exception?
}
return result;
}
结果:
stop
go
答案 1 :(得分:1)
更有活力的东西可能是:
Matcher m = Pattern.compile("\"([^\"]+)\":\"([^\"]+)\"")
.matcher(actionJson);
while (m.find()) {
if ("action".equals(m.group(1)))
return m.group(2);
}
throw new IllegalArgumentException("no action found");
这只是循环遍历所有键值对并返回其键为action
的值。
\"([^\"]+)\"
捕获非空组的引用字符:
\" // begin quote
( // begin capture group
[^\"]+ // 1 or more characters which are not a quote
) // end capture group
\" // end quote
如果唯一的密钥是action
,那么您就不需要循环。
正如评论中已经指出的那样,使用JSON解析器是最好的,因为他们准备好处理任何有趣的业务。例如,我上面使用的正则表达式不会处理空格。
答案 2 :(得分:0)
String subStr = str.replaceAll("(?ius)\\{\".*?\":\"(.*?)\"\\}", "$1");
System.out.println(subStr);
这对我有用