0

我目前正在从事大学作业,并且有一个(很可能很简单)关于正则表达式/正则表达式的问题。

总结;这个任务是一个简单的 RSS 提要管理器,它使用 JSP 和一个 RESTful Web 服务。

我目前正在研究作业规范的一部分,该部分要求我能够输入 XML 提要数据(例如 <feeds><feed><name>FEED NAME</name><uri>http://FEEDuri/</ uri></feed></feeds> etc..)并从这些数据中,通过正则表达式提取 FEED NAME 和 FEEDuri。

我的讲师为我们提供了一个基本的工作方法,我认为我已经在我的 RESTful Web 服务中正确地实现了它,现在我正在实现错误处理。

对于用户没有数据输入的情况,我已经成功实现了错误处理。我的问题是:基于示例方法(如下),是否可以针对提要格式输入不正确的情况实施错误处理

eg:&lt; fed> FEED NAME < /fiid> < uro>http://FEEDuri< /pro>这里的 XML 标签显然是不正确的。

正则表达式是否只会从字符串中提取组,如果它位于作为参数传递给编译方法的定义值之间?

为了补充我的问题,这是给我们使用的基本方法(而不是 XML 解析器):

public static List<Feed> getFeedsFromXml(String xml) {
      Pattern feedPattern = Pattern.compile("<feed>\\s*<name>\\s*([^<]*)</name>\\s*<uri>\\s*([^<]*)</uri>\\s*</feed>");
      Matcher feedMatch = feedPattern.matcher(xml);

      while (feedMatch.find()) {
          String feedName = feedMatch.group(1);
          String feedURI = feedMatch.group(2);
          feeds.add(new Feed(feedName, feedURI));
      }

      return feeds;
}
4

2 回答 2

1

是的,正则表达式只会匹配它匹配的字符串部分。如果您的正则表达式包含"<feed>",则它不会匹配诸如"<fed>"or之类的字符串"<fiid>"

如果输入字符串中的正则表达式不匹配,则在feedMatch.find()您第一次调用它时将简单地返回 false,因此while循环中的任何内容都不会执行。这个方法将简单地返回一个空列表,它可能应该这样做。

于 2012-08-31T00:01:57.027 回答
1

我不完全确定您的确切问题是什么。如果我理解正确,您正在实现错误处理并希望确保干净地处理任何格式错误的 XML。这里有两个考虑因素:1)您需要报告任何格式错误的 XML 的错误,以及 2)您不希望正则表达式匹配正确的 XML 并静默跳过任何格式错误的 XML。

让我们先来看看Matcher.find()简化版的 XML 解析器是如何工作的。我想匹配介于<feed>和之间的任何东西</feed>。为简单起见,我将简单地将结果打印到显示器上。

代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo {

    public static void main(String[] args) {
        System.out.println("Good XML");
        String goodXML = "<feed>CODE-GURU</feed><feed>ALEXM</feed>";
        matchFeeds(goodXML);

        System.out.println("Bad XML 1");
        String badXML1 = "<fed>CODE-GURU</feed><feed>ALEXM</feed>";
        matchFeeds(badXML1);

        System.out.println("Bad XML 2");
        String badXML2 = "<feed>CODE-GURU</fid><feed>ALEXM</feed>";
        matchFeeds(badXML2);

        System.out.println("Bad XML 3");
        String badXML3 = "<feed>CODE-GURU</fid><fiid>ALEXM</feed>";
        matchFeeds(badXML3);
    }

    public static void matchFeeds(String xml) {
        Pattern feedPattern = Pattern.compile("<feed>([^<]*)</feed>");
        Matcher feedMatch = feedPattern.matcher(xml);

        while (feedMatch.find()) {
            String feedName = feedMatch.group(1);

            System.out.println("Feed Name: " + feedName);
        }
    }
}

输出:

Good XML
Feed Name: CODE-GURU
Feed Name: ALEXM
Bad XML 1
Feed Name: ALEXM
Bad XML 2
Feed Name: ALEXM
Bad XML 3

“Good XML”测试准确地打印出预期的结果。但是,如果您不了解 Java 正则表达式的工作原理,“Bad XML 1”和“Bad XML 2”可能会让您感到惊讶。Matcher.find()定位“与模式匹配的输入序列的下一个子序列” 。这意味着它将跳过任何不匹配的内容,直到找到有效匹配项(如果有)。

幸运的是,您可以使用正确的正则表达式强制匹配从输入的开头开始。您只需要\G在正则表达式的开头添加 a ,以便Matcher.find()在最后一场比赛结束时准确开始。所以在我的例子中,正则表达式是"\\G<feed>([^<]*)</feed>".

于 2012-08-31T00:30:55.303 回答