首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能解析字符串java

智能解析字符串java
EN

Stack Overflow用户
提问于 2013-11-27 10:34:07
回答 4查看 5.6K关注 0票数 3

是否有某种规则引擎或一些聪明的方法来做到这一点?

我有一根这样的绳子:

代码语言:javascript
复制
test 1-2-22

这样我就可以得到这些值:

代码语言:javascript
复制
name = "test"
part_id = 1
brand_id = 2
count = 22

我有更多这些所谓的规则,从中我知道字符串的格式。

我在想我可以用regex来做这个,但是有更好的方法来代替吗?

编辑:

我看到了一些很好的答案。也许我应该说得更清楚些。这不是我可能拥有的唯一的字符串类型,我可以拥有这样的字符串:

代码语言:javascript
复制
test 3-brand 15 – 2

解析后的内容应该是:

代码语言:javascript
复制
name = "test"
part_id = 2
brand_id = 3
count = 15

所以我可以有不同的字符串,我需要为每个字符串定义一个规则/模式。做这件事的好方法是什么?Regex目前是一种选择。

EN

回答 4

Stack Overflow用户

发布于 2013-11-27 10:36:20

可以使用以下表达式在空格和破折号之间拆分:

代码语言:javascript
复制
[ -]

然后,您将在从0开始的索引中找到不同的组件。

在Java中:

代码语言:javascript
复制
String input = "test 1-2-22";
String[] results = input.split("[ -]");
票数 3
EN

Stack Overflow用户

发布于 2013-11-27 10:36:21

您可以使用这个Pattern regex

代码语言:javascript
复制
Pattern pattern = Pattern.compile("^([a-zA-Z]+)\\s*([^-]+)-([^-]+)-([^-]+)$");

那么这段代码应该可以工作:

代码语言:javascript
复制
String line = "test 1-2-22";
Pattern pattern = Pattern.compile("^([a-zA-Z]+)\\s*([^-]+)-([^-]+)-([^-]+)$");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
   System.out.printf("name:%s, part_id:%s, brand_id:%s, count:%s%n",
       matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4) );
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-27 10:37:10

在这种情况下,合适的split操作(或其他手动字符串处理)可能是最简单的,因为您有需要显式查找的空白和破折号。

对于更复杂的模式,您可以查看antlr,将其标记为(例如)一个identifier和三个number令牌,然后解析它,但这似乎有点过分。(这会给你一个“规则引擎”,砰。)

一般情况下:您可能需要阅读解析和上下文无关语法的相关内容。

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

https://stackoverflow.com/questions/20240006

复制
相关文章

相似问题

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