如何用Regex替换切割字符串逻辑?

时间:2015-06-01 00:57:01

标签: java regex refactoring

我想将我的笨拙逻辑替换为正则表达式解决方案。我的解决方案有效,但它非常冗余。

我必须处理 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解决这个任务。

如何使用正则表达式解决方案重构此逻辑?

3 个答案:

答案 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);

这对我有用