2011-08-30 58 views
0

有没有什么方法可以显示所有字符和字符串,除了某些字或数字范围,使用Java?例如:显示不匹配的字符串,正则表达式否定

正则表达式:

^(if|else),[0-9] 

输入字符串:

if x <= 7 

输出:

无法识别的令牌:

x , <= 

由于 “if” 和7被否定,它们不会出现。 我可以否定一组正则表达式中的字符串和数字范围吗? 或者还有什么其他方式可以显示不匹配的字符串吗? 我们的任务是显示识别的令牌,然后是不匹配的令牌。我已经研究了三天的正则表达式,但仍然无法完成我的任务。预先感谢您的帮助。

+0

我认为你不能用正则表达式排除字符串,至少在Java中。你必须编写一个匹配其他任何东西的正则表达式。例如,要匹配任何字符串,但要匹配'stack',您需要'[^ s]。* | s [^ t]。* | st [^ a]。* | sta [^ c]。* | stac [^ k ]。* | stack。+'(stackXXX将被允许)。想象一下,正则表达式可以匹配除了几个单词之外的任何东西......一团糟。 – aalku

+0

顺便说一句你正在谈论令牌,但你没有告诉它们是如何定义的。你的意思是令牌是由空格分割字符串的结果吗?那么,你想要自己测试每个令牌吗? – aalku

回答

1

我会使用String.split()将字符串拆分为标记,然后将每个标记与您的“过滤器列表”进行比较。

即使您可以使用正则表达式来完成此操作,它也将不那么简单。

编辑:

事实上,你甚至可能不会需要通过结果进行迭代。你可能会分裂“过滤器”的话。例如:

String[] results = s.split(" *if *| *else *| *[0-9]+ *| +"); 

请注意,你必须把空白的表情,我以为你不想x <=是在结果的单一标记。此外,在关键字周围添加空格将确保您不会以结果集中的空字符串结尾。

+0

是的,在正则表达式中的否定是非常非常困难的。 – jtahlborn

+0

@jtahlborn在正则表达式中没有负面影响并不困难!只要学习使用lookarounds。 – tchrist

+0

@tchrist - 谨慎发布示例?我承认我没有很多正则表达式的经验。 – jtahlborn

1

取决于问题的复杂性,你可以尝试排除模式断言:

\b((?!if|else|\d)\w+)\b 

或回顾后,负前瞻的一些疯狂的组合:

((?<=\A|\s)(?!if|else|\d)\S+) 
0

啊,我要分类的(关键字) 0-9 NUM,等等......

\ b((!!if | else | \ d)\ w +)\ oops,我的坏名字,它确实有效。我意外删除了| 。