如何用 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);

这对我有用