2013-10-03 101 views
3

我有一个像22 + 4 * 3/4的字符串用于*和/的字符串标记的Java分隔符

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

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

基本上我的分隔符字符串是[+ - * /正如我想拆就符号+ - */

但随后,不幸的是,这与正则表达式冲突版本的*,/ 我试着给*和/加[/ - \ * \//]的反斜杠,但它没有帮助。

如何让Java编译*,/按其字面意思?我以为我已完成按照模式的java文档http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#sum

我在这里错过了什么?

感谢

+1

将'-'放在开头或结尾。 –

+0

没有帮助:(如何解决这个问题btw? – adne

+0

谢谢德里曼尼斯 – adne

回答

3

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

[ +*/-]+ 

Regular expression visualization

Debuggex Demo

+1

谢谢大家!!谢谢@arshajii为简明的解释! – adne

2

character class[...]-是特殊字符用于创建角色的范围像a-z。为了使其成为字面值,您需要将它放在类字符[-...]的开头,类尾字符[...-]或者只是简单地用\来避开它,这在Java中需要写为"\\-"。试试这个方法

String[] tokens = str.split("[ +\\-*/]+"); 
0

你试图解析你的字符串?我猜想你会试图对输入流进行词法分析(扫描)。

  • 您可以通过构建strtok和字符lookahead/pushback来手动扫描扫描仪。
  • 你可以使用了像lex或弯曲,以建立一个词汇扫描器
  • 你可以做一个可怜的男人的解析器一系列的正则表达式和case语句

假设你希望来标记你的代数串。您需要定义一个语法以及您想要识别的标记。你需要像BNF(Backus-Naur Formalism)这样的东西,或者你可以使用'铁路语法图'(我个人更喜欢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和任何其他令牌。一路走来,您需要决定如何处理空白(制表符,空格,换行符)和其他未定义的符号。