【问题标题】:Java: use scanner delimiter as tokenJava:使用扫描仪分隔符作为标记
【发布时间】:2011-01-23 04:06:15
【问题描述】:

我正在尝试找到一种让 Scanner 使用给定分隔符作为标记的好方法。例如,我想将一段文本分成数字和非数字块,所以理想情况下,我只需将分隔符设置为 \D 并设置一些标志,如 useDelimiterAsToken,但在简要浏览 API 之后,我'没有想出任何东西。现在我不得不对分隔符使用组合的lookaheads/lookbehinds,这有点痛苦:

scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))");

这会查找从数字到非数字的任何转换,反之亦然。有没有更理智的方法来做到这一点?

【问题讨论】:

标签: java regex token java.util.scanner delimiter


【解决方案1】:

编辑:编辑后的问题是如此不同,我原来的答案根本不适用。郑重声明,在我看来,您正在做的解决问题的理想方法。您的分隔符是数字和非数字之间的零宽度边界,没有比您发布的更简洁的表达方式了。

EDIT2:(针对评论中提出的问题。)您最初要求此正则表达式的替代方法:

"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))"

这几乎就是 \b(单词边界结构)的工作原理:

"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)"

也就是说,一个位置要么前面有一个单词字符,后面没有一个,要么后面有一个单词字符,前面没有一个。不同之处在于\b 可以匹配输入的开头和结尾。你显然不想这样,所以我添加了环视来排除这些条件:

"(?!^)\\b(?!$)"

这只是一种更简洁的方式来完成您的正则表达式所做的事情。但是后来您将要求更改为匹配数字/非数字边界,并且没有像 \b 这样的用于单词/非单词边界的简写。

【讨论】:

  • 我知道,我只是建议使用更短的正则表达式来完成同样的事情。但是您更改了要求,因此现在无关紧要。
  • 对于您的解决方案在第一种情况下的帮助,我仍然有点困惑。现在也是同样的问题,除了数字而不是单词。我只是不希望单词边界成为一个选项,因为我实际上正在做一些更复杂的事情。
猜你喜欢
  • 2020-02-25
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多