Javacc正则表达式匹配除了某些字符串之外的所有字符串

时间:2012-10-18 09:55:59

标签: regex javacc

除了这些字符串之外,匹配任何的正则​​表达式是什么:  =>|

如果您熟悉javacc,我尝试定义我的ANYTHING令牌,如下所示:

TOKEN :
{
 <ARROW: "=>" >
|
 <ANYTHING: (["\u0001" - "\uffdc"])+>
|
 <PIPE: "|">
|
 <UPPER_CHAR: (["A"-"Z"])>
}

由于

2 个答案:

答案 0 :(得分:4)

尝试这样的事情:

Test.jj

options {
    STATIC = false ;
}

PARSER_BEGIN(Test)
public class Test {
  public static void main(String[] args) throws Exception {
    Test parser = new Test(new java.io.StringReader("foo=>bar=baz|done"));
    parser.Parse();
  }
}
PARSER_END(Test)

TOKEN :
{
     < ARROW    : "=>" >
  |  < PIPE     : "|" >
  |  < ANYTHING : (~["=", "|"] | "=" ~[">"])+ >
}

void Parse() : 
{} 
{
  (Any())* <EOF>
}

void Any() :
{Token t;}
{
  ( t=<ARROW>    {System.out.println("ARROW    = '" + t.image + "'");}
  | t=<PIPE>     {System.out.println("PIPE     = '" + t.image + "'");}
  | t=<ANYTHING> {System.out.println("ANYTHING = '" + t.image + "'");}
  )  
}

生成解析器类:

javacc Test.jj

并运行main方法:

java Test

将为输入"foo=>bar=baz|done"打印以下内容:

ANYTHING = 'foo'
ARROW    = '=>'
ANYTHING = 'bar=baz'
PIPE     = '|'
ANYTHING = 'done'

答案 1 :(得分:2)

你可能最好使用词汇状态。这是一个可能有效的RE解决方案

  ("=")+    |     ( ~["=","|"]  |  ("=")* ~["=","|",">"] )+  ("=")*

顺便说一下,我稍微更改了一下这个问题,以便空字符串不是“任何东西”,所以这个字符串应匹配任何非空的字符串,不包含任何“|”s,也不包含任何“=&gt; “第