首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中使用regex的更简洁的解决方案

在java中使用regex的更简洁的解决方案
EN

Stack Overflow用户
提问于 2014-12-15 19:04:10
回答 4查看 152关注 0票数 3

我希望解析一个字符串并返回特定人的适配号。例如,我可以输入Paul,我的方法应该返回34

目前,我正在通过使用Stringsubstring方法(我的字符串总是以相同的格式格式化)来实现这一点:

代码语言:javascript
复制
String s = "{name : John, id : '0', fit : '34' }, {name : Paul, id : '0', fit : '34' },{name : Will, id : '0', fit : '24' } ";
String mainGrouping = s.substring(s.indexOf("Paul"));
System.out.println("Main Grouping: "+ mainGrouping);
String subGrouping = mainGrouping.substring(0, mainGrouping.indexOf('}'));
System.out.println("Sub grouping: " + subGrouping);
String fitGrouping= subGrouping.substring(subGrouping.indexOf("fit"));
String finalAnswer = fitGrouping.replaceAll("[^0-9]", "");

System.out.println("final substring: " + finalAnswer);

我相信有一个更简单、更简洁的解决方案,只使用一个正则表达式。然而,我对这个话题基本不熟悉。我的假设正确吗?如果是的话,你能解释一下你的regex解决方案吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-15 19:16:53

代码语言:javascript
复制
\{name : John, [^\}]*?fit : '(\d+)'.*?\}

如果将这个regex模式应用于示例字符串,则该模式将匹配第一个组中的fit值。

以防万一您希望使用此方法解析JSON字符串:它不会那样工作。首先,您不能依赖于JSON中的属性顺序。

如果您真的想解析JSON,就像其他人提到的那样使用库。如果您的示例字符串是合法的,并且您只需要这样做,那么regex模式(或稍微修改一下的版本)就足够了。

票数 1
EN

Stack Overflow用户

发布于 2014-12-15 19:18:40

正如对这个问题的注释中所指出的那样,看起来您的输入数据可以转换为JSON弦,因此可以使用JSON解析库(如葛森 )进行解析。

在这种情况下,输入字符串s应该如下所示:

String s = "[{"name" : "John", "id" : 0, "fit" : 34 }, {"name" : "Paul", "id" : 0, "fit" : 34 }, {"name" : "Will", "id" : 0, "fit" : 24 }]";

票数 0
EN

Stack Overflow用户

发布于 2014-12-15 19:25:01

假设每个name都有一个与其相关联的fit,并且每个名称都出现在其各自的fit之前,那么类似这样的东西应该可以工作:

代码语言:javascript
复制
Matcher matcher = pattern.compile("name: " + nameToFind + ", .*?fit:'(\d+)'").matcher(s);
String fit = matcher.find() ? matcher.group(1) : null;

如果您需要重复执行此操作,并且可能需要针对不同的属性,请考虑将while字符串解析为映射(映射):

代码语言:javascript
复制
Matcher m = Pattern.compile("\\{(.+?)\\}").matcher(s);
Pattern p = Pattern.compile("(\w+?): '?(\\w*?)'?");
Map<String, Map<String, String>> result = new HashMap<>();
while(m.find()) {
    Matcher m2 = p.matcher(m.group(1));
    Map<String, String> map = new HashMap<>();
    while(m2.find()) { map.put(m2.group(1), m2.group(2)); }
    result.put(map.get("name"), map);
}

现在,要为"Paul“找到"fit”的值,只需执行result.get("Paul").get("fit")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27491239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档