如何用 Regex 替换切割字符串逻辑?
How replace cutting string logic with Regex?
我想将笨拙的逻辑替换为正则表达式解决方案。我的解决方案有效,但它非常多余。
我必须处理 JSON 数据:
{"action":"stop"}
并仅作为结果 - stop
.
这是我的解决方案:
private String processAction(String actionJson) {
String[] data = actionJson.split(":");
int limit = data[1].length() - 3;
String result = data[1].substring(1, limit);
return result;
}
我想知道如何使用 Regex 解决这个任务。
如何用正则表达式重构这个逻辑?
只要您处理 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
更有活力的东西可能是这样的:
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");
这只是遍历所有键值对和 returns 键为 action
.
的值
\"([^\"]+)\"
捕获一组非空的引用字符:
\" // begin quote
( // begin capture group
[^\"]+ // 1 or more characters which are not a quote
) // end capture group
\" // end quote
如果唯一的键是 action
,则不需要循环。
正如评论中已经指出的那样,使用 JSON 解析器是最好的,因为它们已准备好处理任何有趣的业务。例如,我上面使用的正则表达式不处理空格。
String subStr = str.replaceAll("(?ius)\{\".*?\":\"(.*?)\"\}", "");
System.out.println(subStr);
这对我有用
我想将笨拙的逻辑替换为正则表达式解决方案。我的解决方案有效,但它非常多余。
我必须处理 JSON 数据:
{"action":"stop"}
并仅作为结果 - stop
.
这是我的解决方案:
private String processAction(String actionJson) {
String[] data = actionJson.split(":");
int limit = data[1].length() - 3;
String result = data[1].substring(1, limit);
return result;
}
我想知道如何使用 Regex 解决这个任务。
如何用正则表达式重构这个逻辑?
只要您处理 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
更有活力的东西可能是这样的:
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");
这只是遍历所有键值对和 returns 键为 action
.
\"([^\"]+)\"
捕获一组非空的引用字符:
\" // begin quote
( // begin capture group
[^\"]+ // 1 or more characters which are not a quote
) // end capture group
\" // end quote
如果唯一的键是 action
,则不需要循环。
正如评论中已经指出的那样,使用 JSON 解析器是最好的,因为它们已准备好处理任何有趣的业务。例如,我上面使用的正则表达式不处理空格。
String subStr = str.replaceAll("(?ius)\{\".*?\":\"(.*?)\"\}", "");
System.out.println(subStr);
这对我有用