Processing math: 0%
iteye_7642 2009-02-20 13:19
浏览 300
已采纳

java正则表达式实现字符串匹配

问题描述:
resultStr = "@inproceedings{1031197, author = {S. Alireza Aghili and Divyakant Agrawal and Amr El Abbadi}, title = {Protein structure alignment using geometrical features}, booktitle = {CIKM '04: Proceedings of the thirteenth ACM international conference on Information and knowledge management}, year = {2004}, isbn = {1-58113-874-1}, pages = {148--149}, location = {Washington, D.C., USA}, doi = {http://doi.acm.org/10.1145/1031171.1031197}, publisher = {ACM}, address = {New York, NY, USA}, },"

要将resultStr中{}内部的内容识别出来,并与 = 前的内容匹配。即得到
author的值为S. Alireza Aghili and Divyakant Agrawal and Amr El Abbadi,
title的值为Protein structure alignment using geometrical features,等等。

我的做法有些问题,运行结果不正确,请大家指点,谢谢!

                 /**
     * 对BitTex输出格式识别
     * 
     */
    public static GlobalMode bitTex_identify(String resultStr) {
        GlobalMode obj = new GlobalMode();

        Pattern p = Pattern.compile("(\\s[\\w]+\\s=)(\\s\\{.*?},)");
        Matcher m = p.matcher(resultStr);
        String reStr[] = new String[100];
        int i = 0;

        while (m.find()) {
            i++;
            reStr[i] = (m.group(1) + m.group(2)).trim();

            String value = reStr[i].substring(reStr[i].indexOf("{") + 1,
                    reStr[i].lastIndexOf("}"));
            if(reStr[i].startsWith("author")){
                obj.setAuthor(value);

                continue;
            }
            if (reStr[i].startsWith("title")) {
                obj.setTitle(value);
                continue;
            }
            if (reStr[i].startsWith("journal")) {
                obj.setJournal(value);
                continue;
            }

            if (reStr[i].startsWith("booktitle")) {
                obj.setBooktitle(value);
                continue;
            }

            if (reStr[i].startsWith("year")) {
                obj.setYear(value);
                continue;
            }

            if (reStr[i].startsWith("month")) {
                obj.setMonth(value);
                continue;
            }

            if (reStr[i].startsWith("pages")) {
                obj.setPages(value);
                continue;
            }

            if (reStr[i].startsWith("volume")) {
                obj.setVolume(value);
                continue;
            }
            if (reStr[i].startsWith("number")) {
                obj.setNumber(value);
                continue;
            }

            if (reStr[i].startsWith("publisher")) {
                obj.setPublisher(value);
                continue;
            }

            if (reStr[i].startsWith("location")) {
                obj.setLocation(value);
                continue;
            }

            if (reStr[i].startsWith("addresultStrss")) {
                obj.setAddress(value);
                continue;
            }
            if (reStr[i].startsWith("isbn")) {
                obj.setIsbn(value);
                continue;
            }
            if (reStr[i].startsWith("doi")) {
                obj.setDoi(value);
                continue;
            }

            if(reStr[i].startsWith("issue_description")){
                obj.setTitle(value);
                continue;
            }
            if(reStr[i].startsWith("issue_date")){
                obj.setYear(value);
                //obj.setYear(value.substring(value.indexOf(" ")));
                continue;
            }

        }
        return obj;

    }

补充: 1、感觉这么写if语句太繁琐,但不知道怎么改。
2、程序其它地方要用到返回的author,title等值,如:要用参考文献的格式将这些值打印出来。
[b]问题补充:[/b]
不好意思,之前我说的问题不清楚。我是在得到这样的数据之后需要再处理
author =S. Alireza Aghili and Divyakant Agrawal and Amr El Abbadi
title =Protein structure alignment using geometrical features
booktitle =CIKM '04: Proceedings of the thirteenth ACM international conference on Information and knowledge management
year =2004
...
最终目的是能随意调用author,title 这些值。如:要用参考文献的格式将这些值打印出来。
[b]问题补充:[/b]
您所说的数据项是指author这些么?
那是不是还要用if-else语句来判断?
[b]问题补充:[/b]
Sorry,我总是表达的不够清楚。
我是想定义一个实例obj,将author,title这些对应的值分别赋值给obj.author, obj.title等,最后可以随意调用obj.author, obj.title。
我的代码基本上能实现这个功能,但是觉得用这么多的if-else语句有些繁琐,是否有简单高效的实现方法呢?请指教,谢谢~

展开全部

  • 写回答

5条回答 默认 最新

  • bohemia 2009-02-24 00:44
    关注

    [code="java"]String resultStr ="字符串";

    Pattern p = Pattern.compile("[\s\t]+([\w\s]+)=[\s]+\{([^}]+)\}");

    Map tmpMap = new HashMap();

    Matcher m = p.matcher(resultStr);

    while(m.find()){

    String key=m.group(1);

    String value=m.group(2);

    System.out.println(key+"="+value);

    tmpMap.put(key,value);

    }

    GlobalMode obj = new GlobalMode();

    obj.setAuthor(tmpMap.get("author"));

    obj.setTitle(tmpMap.get("title"));

    .... [/code]

    上面写错了个变量名. ..这样才对.

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥50 代码还没怎么运行但是需要代码功能调用数据
  • ¥15 vue请求不到数据,返回状态200,数据为html
  • ¥15 访问url时不会自动调用其 Servlet的doGet()
  • ¥15 用白鹭引擎开发棋牌游戏的前端为什么这么难找
  • ¥35 哪位专业人士知道这是什么原件吗?哪里可以买到?
  • ¥15 关于#c##的问题:treenode反序列化后获取不到上一节点和下一节点,Fullpath和Handle报错
  • ¥15 一部手机能否同时用不同的app进入不同的直播间?
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部