我有一个像22 + 4 * 3/4的字符串
现在,我需要从此字符串中提取标记。这是我的一行代码:
String[] tokens = str.split( [ +-*/]+ )
基本上我的分隔符字符串是[+ - * /]因为我想分割符号+ - * /
但不幸的是,这与*的正则表达式版本相冲突, 我尝试将反斜杠添加到*和/作为[+ - \ * \ /],但它没有帮助。
如何通过字面意思使Java编译*,/?我以为我按照关于模式http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#sum
的java文档做了我在这里想念的是什么?
感谢
答案 0 :(得分:3)
实际上,当在字符类中使用时,*
和+
会失去它们的特殊含义(毕竟它们在字符类中没有意义)。因此,我们不需要逃避这些角色。相反,-
仅在字符类中具有特殊含义,但仅在字符之间使用时才表示范围。如果在开始或结束时使用它,则没有特殊含义。所以,我们有:
[ +*/-]+
答案 1 :(得分:2)
在character class [...]
-
中,特殊字符用于创建a-z
等字符范围。要使它成为文字,你需要将它放在类字符[-...]
的开头,类结束字符[...-]
或者只是简单地用\
转义它,在Java中需要将其写为{{ 1}}。试试这种方式
"\\-"
答案 2 :(得分:0)
你想解析你的字符串吗?我的猜测是你正在尝试对输入流进行词法分析(扫描)。
假设您确实想要代数化您的代数字符串。您需要定义语法以及要识别的标记。你需要像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以及您要提取的任何其他标记。在此过程中,您需要决定如何处理空格(制表符,空格,换行符)和其他未定义的符号。