如何才能将语句解析出find kw=a kw1=b kw3=d c lc=e 
a b d c e 
XX=X 可能无限多 
请高手帮忙

解决方案 »

  1.   

    你的问题不是描述的很清楚,
    你是不是要找 xx=x的等式啊, 
    还是只查找等式右边含有a,b,d,c,e的情况.........
      

  2.   

    kw3=d c 这个可不符合你说的XX=X形式
      

  3.   

    其实这个是一个数据库的语句.现在我要把这个语句解析了,找出里面的关键字
    就好像是Sql一样
    关键字一般是在=号右边的.也可以没有XX=X号 只要输入find X 也是可以查找到X的
      

  4.   

    如何才能将语句解析出find 字段名1=关键词1 字段名2=关键词2 字段名3=关键词3 关键词4 字段名4=关键词5
    怎样才能解析出  关键词1 关键词2 关键词3 关键词4 关键词5 
    (字段名=关键词 和 关键词 )可能无限多 
    其实这个是一个数据库的语句.现在我要把这个语句解析了,找出里面的关键字 
    就好像是Sql一样 
    关键字一般是在=号右边的.也可以没有XX=X号 只要输入find X 也是可以查找到X的 
      

  5.   

    如何才能将语句 [ find 字段名1=关键词1 字段名2=关键词2 字段名3=关键词3 关键词4 字段名4=关键词5 ]
    解析出[ 关键词1 关键词2 关键词3 关键词4 关键词5 ]
    (字段名N=关键词N 和 关键词N )可能无限多 
    其实这个是一个数据库的语句.现在我要把这个语句解析了,找出里面的关键字 
    就好像是Sql一样 
    关键字一般是在=号右边的.也可以没有字段名和等号 只要输入find 关键词 也是可以查找到要查询的关键词所在文献的 
    我感觉已经说的够清楚了吧
    就是从上面那句里用正则表达式,或是别的什么方法得到用户所输入的关键词
      

  6.   

    String s = "find 字段名1=关键词1 字段名2=关键词2 字段名3=关键词3 关键词4 字段名4=关键词5";
    Pattern p = Pattern.compile("(?<=\\=)[^ ]*");
    Matcher m = p.matcher(s);
    while(m.find()) {
    System.out.println(s.substring(m.start(), m.end()));
    }关键词1
    关键词2
    关键词3
    关键词5
    不知道你是否要这样的输出
      

  7.   

    (?<=X) X,通过零宽度的正 lookbehind 通过零宽度的正是什么意思呀
      

  8.   

    可以用Scanner
    下面给你一个例子扫描器还可以使用不同于空白的分隔符。下面是从一个字符串读取若干项的例子:         String input = "1 fish 2 fish red fish blue fish";
             Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
             System.out.println(s.nextInt());
             System.out.println(s.nextInt());
             System.out.println(s.next());
             System.out.println(s.next());
             s.close(); 输出为:         1
             2
             red
             blue 
      

  9.   

    String s = "find 字段名1=关键词1 字段名2=关键词2 字段名3=关键词3 关键词4 字段名4=关键词5 ";
    Pattern p = Pattern.compile("(?<=(\\=| ))[^( |=)]+(?=( |$))");
    Matcher m = p.matcher(s);
    while(m.find()) {
    System.out.println("'" + s.substring(m.start(), m.end()) + "'");
    }这个可以了吧
    JDK的中文API翻译有点烂,这个应该叫【零宽断言】,是正则表达式中的高级的技巧,是为了断言匹配的字符串符合某些规范的。
      

  10.   

    有无限个也不用怕,可以用里面的方法hasNext 然后用while循环写,
    只是给一个建议
    同时也可以用 StringTokenizer 里面也有 hasMoreTokes 这个方法,可以帮助你
      

  11.   

    [code=Java] String s = "find 字段名1=关键词1 字段名2=关键词2 字段名3=关键词3 关键词4 字段名4=关键词5";
    Pattern p = Pattern
    .compile(
    "^(?:(?:Find)?\\s{1,})?\\s*[[\\P{InGreek}]+\\s*=\\s*]*(\\b\\P{InGreek}+\\b)",
    Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(ccl);
    int groupCount = m.groupCount(); 
    while (m.find()) {
    System.out.println(m.group());
    System.out.println(m.group(1)); 
     
    }
    System.out.println(groupCount);
    [code]
    我是这样写的,可惜只能得能在这个语句System.out.println(m.group(1));  的时候得到  关键词5
    前面的就得不到了
      

  12.   

     String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 xor 关键词4 and  字段名4=关键词5 TS=TO 2008-06-11, FR 2007-06-11 ";
    这个还可以解析成为关键词1 
    关键词2 
    关键词3 
    关键词4
    关键词5
    吗 
      

  13.   


    你的需求好复杂,像 TS=TO 这些,正则表达式根本就不认识的
      

  14.   

    那写java代码也行呀
    单独的写正则表达式估计是不行了
      

  15.   

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test3 {    public static void main(String[] args) {
            String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 " +
                    "xor 关键词4 and 字段名4=关键词5 TS=TO 2008-06-11, FR 2007-06-11 ";
            Pattern p = Pattern.compile("(?<=(?:=|x?or|not|and) ?)(?<!TS=)[^ =]++(?! *=)");
            Matcher m = p.matcher(s);
            while(m.find()) {
                System.out.println(m.group());
            }
        }
    }因为你现在只要关键词1
    关键词2
    关键词3
    关键词4
    关键词5这种样子的,TS=XX 的忽略掉,现在只能做到这些。
    而且像“关键词4”那样的前面最多只允许有一个空格!(若要允许多个的话还得改表达式)
      

  16.   

    服了
    我要加你为好友
    呵呵 
    MSN:[email protected]
      

  17.   

    不明白(?<=X)这是什么意思啊
    就本题而言是说找到=后面的内容吗?
    (?<=\\=)
    前一个\是转义
    转义后(?<=\=)又是什么意思啊
      

  18.   

    (? <=X)是 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
    (? <=\\=) 表示 在匹配出来的字符串的前面必须是等号
    零宽断言有四种的,具体情况你找一下正则表达式的教程吧
      

  19.   

    本打算结帖的,可是还是有个问题没解决,呵呵  貌似没完没了了.让大家见谅
    String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 "
    + "xor 关键词4 关键词6 TS=TO 2008-06-11, FR 2007-06-11 and 字段名4=关键词5 关键词7";在关键词6处的前面不加(and or not xor)这个语句也是对的,所以也要解析这种情况的
    现在就是如何怎么解析成
    关键词1 
    关键词2 
    关键词3 
    关键词4 
    关键词6
    关键词5 
    关键词7
    [顺序没要求的],怎么写表达式解析这个结果呀?  先谢谢大家的参与再问一个若若的问题 [^ =]++  这个是什么意思呀?  [^ =]+表示 非空格和=号有1到N个 后面再加个+号就不清楚了?哪们高手能给解析一下吗?
      

  20.   

    本打算结帖的,可是还是有个问题没解决,呵呵  貌似没完没了了.请大家见谅 String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 "
    + "xor 关键词4 关键词6 TS=TO 2008-06-11, FR 2007-06-11 and 字段名4=关键词5 关键词7";
    (本想让关键词6变个颜色的,可是UBB不能嵌套,只有再发一遍了,上面的帖还不能自己删除,郁闷)在关键词6处的前面不加(and or not xor)这个语句也是对的,所以也要解析这种情况的 
    现在就是如何怎么解析成 
    关键词1 
    关键词2 
    关键词3 
    关键词4 
    关键词6 
    关键词5 
    关键词7 
    [顺序没要求的],怎么写表达式解析这个结果呀?  先谢谢大家的参与 
     再问一个若若的问题 [^ =]++  这个是什么意思呀?  [^ =]+表示 非空格和=号有1到N个 后面再加个+号就不清楚了?哪们高手能给解析一下吗?
      

  21.   

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test3 {    public static void main(String[] args) {
            String s = "find 字段名1=关键词1 not 字段名2=关键词2 关键词3 or " +
                    "字段名3=关键词4 关键词5 关键词6 关键词7 xor 关键词8 关键词9 " +
                    "TS=TO 2008-06-11, FR 2007-06-11 " +
                    "and 字段名4=关键词10 关键词11 or 关键词12";
            Pattern p = Pattern.compile("(?<=(?:=|x?or|not|and) ?)(?<!TS=)((?!x?or|not|and)[^ =]+(?: |$))+");
            Matcher m = p.matcher(s);
            while(m.find()) {
                System.out.println(m.group());
            }
        }
    }输出的结果是一堆这样的:关键词1 
    关键词2 关键词3 
    关键词4 关键词5 关键词6 关键词7 
    关键词8 关键词9 
    关键词10 关键词11 
    关键词12再将 while(m.find()) 改为这样就行了:        while(m.find()) {
                String[] str = m.group().split(" ");
                for(int i = 0; i < str.length; i++) {
                    System.out.println(str[i]);
                }
            }
      

  22.   

    再问一个若若的问题 [^ =]++  这个是什么意思呀? [^ =]+表示 非空格和=号有1到N个 后面再加个+号就不清楚了—————————————————————————————————————————————————————[^ =]++(?! *=)后面的那个加号属于匹配量词,称为侵占式量词,以最大的方式进行匹配,与 * 号(贪婪量词)不同的是,
    侵占量词在匹配成功后,并不会产生回退,不会让出已匹配成功的字符来用于匹配表达式后面的东西。[^ =]++ 与独立分组写法 (?>[^ =]+) 的意思是一样的,(?>) 即 java.util.regex.Pattern API DOC 中
    特殊构造中的最后一个。
      

  23.   


    你跟哪儿学的呀
    呵呵 ,这么系统
    我只是从网上搜一些看看,都没你说的这么具体,还有贪婪量词和侵占式量词都没听过
    你能发些资料给我
    呵呵 Email:[email protected]
      

  24.   

    帖子已经结了
    只感觉bao110908 很牛
    呵呵 
    晚上回去把正则好好研究一下
      

  25.   

    http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html?seed=257390998强人给的修炼正则的秘籍
    大家可以去看一下
      

  26.   

    bao110908  在csdn上面用即时聊天老是只能看到你发的消息提示,不能看你的消息内容
    郁闷呀
    你的MSN或QQ是多少呀?呵呵 
    如果方便的话可以留到这里或是发私信告诉我吗?对了还有个问题 String s = "find 字段名1=关键词1 not 字段名2=关键词2 关键词3 or " +
                    "字段名3=关键词4 关键词5 关键词6 关键词7 xor 关键词8 关键词9 " +
                    "TS=TO 2008-06-11, FR 2007-06-11 " +
                    "and 字段名4=关键词10 关键词11 or 关键词12";
            Pattern p = Pattern.compile("(?<=(?:=|x?or|not|and) ?)(?<!TS=)((?!x?or|not|and)[^ =]+(?: |$))+");
    这个是可以用的
    但是如果 String s = "find 关键词1";
    就不行了
    怎么结合上面那个改呀^_^
      

  27.   

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;public class Test {    public static void main(String[] args) {
            String s = "find 关键词A 关键词B 字段名1=关键词1 not 字段名2=关键词2 关键词3 or " +
                    "字段名3=关键词4 关键词5 关键词6 关键词7 xor 关键词8 关键词9 " +
                    "TS=TO 2008-06-11, FR 2007-06-11 " +
                    "and 字段名4=关键词10 关键词11 or 关键词12";
            Pattern p = Pattern.compile("(?<=(?:^find|=|x?or|not|and) ?)(?<!TS=)((?!x?or|not|and)[^ =]+(?: |$))+");
            Matcher m = p.matcher(s);
            while(m.find()) {
                System.out.println(m.group());
            }
        }
    }关键词A 关键词B
    关键词1
    关键词2 关键词3
    关键词4 关键词5 关键词6 关键词7
    关键词8 关键词9
    关键词10 关键词11
    关键词12