用于*和/的字符串标记的Java分隔符

时间:2013-10-03 23:51:33

标签: java regex string

我有一个像22 + 4 * 3/4的字符串

现在,我需要从此字符串中提取标记。这是我的一行代码:

String[] tokens  = str.split( [ +-*/]+ )

基本上我的分隔符字符串是[+ - * /]因为我想分割符号+ - * /

但不幸的是,这与*的正则表达式版本相冲突, 我尝试将反斜杠添加到*和/作为[+ - \ * \ /],但它没有帮助。

如何通过字面意思使Java编译*,/?我以为我按照关于模式http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#sum

的java文档做了

我在这里想念的是什么?

感谢

3 个答案:

答案 0 :(得分:3)

实际上,当在字符类中使用时,*+会失去它们的特殊含义(毕竟它们在字符类中没有意义)。因此,我们不需要逃避这些角色。相反,- 在字符类中具有特殊含义,但仅在字符之间使用时才表示范围。如果在开始或结束时使用它,则没有特殊含义。所以,我们有:

[ +*/-]+

Regular expression visualization

Debuggex Demo

答案 1 :(得分:2)

character class [...] -中,特殊字符用于创建a-z等字符范围。要使它成为文字,你需要将它放在类字符[-...]的开头,类结束字符[...-]或者只是简单地用\转义它,在Java中需要将其写为{{ 1}}。试试这种方式

"\\-"

答案 2 :(得分:0)

你想解析你的字符串吗?我的猜测是你正在尝试对输入流进行词法分析(扫描)。

  • 您可以通过构建strtok和角色前瞻/后推手动扫描扫描仪。
  • 您可以使用类似lex或flex来构建词法扫描程序
  • 你可以为一个糟糕的勒芒解析器提供一系列正则表达式和case语句

假设您确实想要代数化您的代数字符串。您需要定义语法以及要识别的标记。你需要像BNF(Backus-Naur形式主义)这样的东西,或者你可以使用'铁路语法图'(个人而言,我更喜欢BNF,但有些人喜欢铁路图)。

这是一个开始:

expression --> sexpr | nil
parenexpr  --> '(' sexpr ')'
sexpr   --> parenexpr | addexpr | thing | nil
addexpr --> mulexpr addop mulexpr | mulexpr
mulexpr --> parenexpr
thing   --> symbol | integer | real | scientific
integer --> { '+' | '-' }? digit+
real    --> { '+' | '-' }? digit+ { . digit+ }?
scientific --> { + | - }? digit+ { . digit+ } e { '+' | '-' }? digit+
addop   --> '+' | '-'
mulop   --> '/' | '*' | '^' | '%'
relop   --> '||' | '&&' | '!'
symbol  --> { character | '_' } { character | '_' | digit }*
digit   --> [0-9]
character --> [A-Za-z]
//etc

这意味着,语法生成符号( - >)左侧的每个项目都会扩展到右侧的某个项目。请注意,此定义是递归的,它可以让您了解所需的编程类型。无论如何,您将需要扫描并识别每个标记以收集整数,真实,科学,符号,addop,mulop,relop以及您要提取的任何其他标记。在此过程中,您需要决定如何处理空格(制表符,空格,换行符)和其他未定义的符号。