java - 如何使扫描仪返回分隔符作为标记
问题描述
我试图用来java.util.Scanner
标记一个算术表达式,其中分隔符可以是:
- 空白(
\s+
或\p{Space}+
),应该被丢弃 - 标点 (
\p{Punct}
),应作为标记返回
例子
给定这个表达式:
12 + (ab-bc*3)
我希望 Scanner 返回这些令牌:
12
+
(
ab
-
bc
*
3
)
代码
到目前为止,我只能:
- 吃掉所有的标点符号(不是我想要的):
new Scanner("12 + (ab-bc*3)").useDelimiter("\\p{Space}+|\\p{Punct}").tokens().collect(Collectors.toList())
- 结果:
"12", "", "", "", "ab", "bc", "3"
- 使用积极的前瞻取得部分成功
new Scanner("12 + (ab-bc*3)").useDelimiter("\\p{Space}+|(?=\\p{Punct})").tokens().collect(Collectors.toList())
- 结果:
"12", "+", "(ab", "-bc", "*3", ")"
但现在我被困住了。
解决方案
匹配方法允许您在此处使用更简单的正则表达式:
String text = "12 + (ab-bc*3)";
List<String> results = Pattern.compile("\\p{Punct}|\\w+").matcher(text)
.results()
.map(MatchResult::group)
.collect(Collectors.toList());
System.out.println(results);
// => "12", "+", "(", "ab", "-", "bc", "*", "3", ")"
请参阅Java 演示。
正则表达式匹配
\p{Punct}
- 标点符号和符号字符|
- 或者\w+
- 1+ 字母、数字或_
字符。
请参阅正则表达式演示(出于演示目的转换为 PCRE)。
推荐阅读
- java - 如何区分 jQAssistant 中的“直接”和“间接”依赖关系
- html - 如何在 Safari 上重置默认按钮焦点样式?
- python - 如何使用我的分布式应用程序打开控制台窗口?
- sql - 如何将两行中的数据放入一个单元格中?- SQL 开发人员
- sql - 在关系代数中选择 *
- crashlytics - Firebase Crashlytics 需要多长时间才能报告?
- python - 如何将时间戳转换为 dajngo 中归档的日期时间
- c# - 尝试根据 datetime.now 设置日期时间开始时间
- java - 如何使用 java 的 jupyter 服务器 rest api 调用将笔记本内容上传到 jupyter 服务器?
- c# - C# 反射 - 获取所有实现接口的类型并按类类型应用它们?