如何将 Scanner return 分隔符作为标记
How to make Scanner return delimiters as tokens
我正在尝试使用 java.util.Scanner
来标记算术表达式,其中分隔符可以是:
- 空白(
\s+
或 \p{Space}+
),应丢弃
- 标点符号 (
\p{Punct}
),应 returned 作为标记
例子
给出这个表达式:
12 + (ab-bc*3)
我希望扫描器return这些标记:
12
+
(
ab
-
bc
*
3
)
代码
到目前为止,我只能:
- 吃掉所有的标点字符(不是我想要的):
new Scanner("12 + (ab-bc*3)").useDelimiter("\p{Space}+|\p{Punct}").tokens().collect(Collectors.toList())
- 结果:
"12", "", "", "", "ab", "bc", "3"
- 使用 positive lookahead 取得部分成功
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 demo。
正则表达式匹配
\p{Punct}
- 标点和符号字符
|
- 或
\w+
- 1+ 个字母、数字或 _
个字符。
请参阅 regex demo(出于演示目的已转换为 PCRE)。
我正在尝试使用 java.util.Scanner
来标记算术表达式,其中分隔符可以是:
- 空白(
\s+
或\p{Space}+
),应丢弃 - 标点符号 (
\p{Punct}
),应 returned 作为标记
例子
给出这个表达式:
12 + (ab-bc*3)
我希望扫描器return这些标记:
12
+
(
ab
-
bc
*
3
)
代码
到目前为止,我只能:
- 吃掉所有的标点字符(不是我想要的):
new Scanner("12 + (ab-bc*3)").useDelimiter("\p{Space}+|\p{Punct}").tokens().collect(Collectors.toList())
- 结果:
"12", "", "", "", "ab", "bc", "3"
- 使用 positive lookahead 取得部分成功
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 demo。
正则表达式匹配
\p{Punct}
- 标点和符号字符|
- 或\w+
- 1+ 个字母、数字或_
个字符。
请参阅 regex demo(出于演示目的已转换为 PCRE)。