【问题标题】:How to get next token from string?如何从字符串中获取下一个令牌?
【发布时间】:2015-11-20 19:30:31
【问题描述】:

我想写一个小算法。

我面临以下问题:我有一个 String,它可以包含数字和以下符号:-()。我想解析它,所以我可以得到每个符号和数字。

我要写的方法,(getNextToken)应该连续返回符号和数字。例如:getNextToken("(123-456)-12-1") 应该返回:

  • 第一次通话:"("
  • 第二次通话:"123"
  • 第三次通话:"-"

等等。

我面临的问题是每个数字部分可以包含多个数字。

我知道写这种函数没什么大不了的,但它不是“原始”函数。那么,Java有没有解决这个问题的utilit类呢?

【问题讨论】:

  • 我不确定我是否理解你的问题。一个例子可能会有所帮助。
  • @Mukul Goe 将示例添加到主题
  • 我认为正则表达式可以解决您的搜索问题。也许分享你的代码?
  • @RC。抱歉英语不好。我将 1、2、3 称为数字,而 123 对我来说是数字。
  • 您可以创建自己的方法来使用 char 数组轻松解析数字。

标签: java string parsing


【解决方案1】:

可以调用java.util.StringTokenizer 将分隔符包含在标记中

String str = "(123-456)-12-1";
StringTokenizer tokenizer = new StringTokenizer( str,"-()",true);
while (tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
 }

返回

(
123    
-
456
)
-
12
-
1

这是你想要的吗?

【讨论】:

  • 这没问题,但会产生一些意想不到的结果。例如,如果在原始输入字符串中添加一些空格会发生什么?
  • 如果您想使用 spit,可以使用 String[] result = str.split("((?<=-)|(?=-))|((?<=\\))|(?=\\)))|((?<=\\()|(?=\\())"); 来完成,这对我来说可读性较差,但如果他们弃用了分词器,它的寿命可能会更长。
  • 是的,没错。哪个更易于维护,OP 还是您刚刚发布的那个正则表达式恐怖?可爱的小杰布斯人。 blog.codinghorror.com/…
  • @markspace 真,如果这在问题的范围内。我假设将检查每个令牌的有效性。如果我们使用String str = "(123-45 6)-12-1";,我们会得到( ... 45 6 ... 1。如果需要,45 6 可以去掉空格,或者,如果作用域需要更严格的操作,无效标记将引发异常。
  • @JohnTeixeira 空格在解析中很常见,我认为它一定在问题范围内。我想可能不是,但这很不寻常。
【解决方案2】:

另一个与JohnTeixeira's answer输出相同的正则表达式解决方案:

String input = "(123-456)-12-1";
Pattern pattern = Pattern.compile("([()-]|\\d+)");
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

并且它不使用“不推荐”StringTokenizer 类。你可以找到这个正则表达式here的确切细节。

【讨论】:

    【解决方案3】:

    我不确定这是否是您正在寻找的内容,而且它不是真正可读的。这就是正则表达式的问题:\

    String str = "(123-456)-12-1";
    String splittedStr = Arrays.toString(str.split("((?<=-)|(?=-)|(?<=[(])|(?=[(])|(?<=[)])|(?=[)]))"));
    System.out.println(splittedStr);
    // Outputs: [(, 123, -, 456, ), -, 12, -, 1]
    

    编辑: 我发现我使用的正则表达式可以简化很多。这个新示例使用新的缩短版本:

    String str = "(123-456)-12-1";
    String splittedStr = Arrays.toString(str.split("((?<=-|[(]|[)])|(?=-|[(]|[)]))"));
    System.out.println(splittedStr);
    // Output: [(, 123, -, 456, ), -, 12, -, 1]
    

    【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2018-06-05
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多