Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的媒人失败了?_Java_Regex - Fatal编程技术网

Java 为什么我的媒人失败了?

Java 为什么我的媒人失败了?,java,regex,Java,Regex,我正在将一个字符串传递到我的歌曲解析器方法中,但它失败了,我不知道为什么。所有事物都返回null或0 我的解析器方法是 public static Song parseSong(String songString){ Map<String, String> songMap = new HashMap<String, String>(); Pattern pattern = Pattern.compile(".*<key>(.+)</key>

我正在将一个字符串传递到我的歌曲解析器方法中,但它失败了,我不知道为什么。所有事物都返回null或0

我的解析器方法是

 public static Song parseSong(String songString){
  Map<String, String> songMap = new HashMap<String, String>();
  Pattern pattern = Pattern.compile(".*<key>(.+)</key><(.+)>(.+)</.+>.*\n");
  Scanner scanner = new Scanner(songString);
  if(scanner.hasNext(pattern))
  {
     String line = scanner.next(pattern);
     Matcher matcher = pattern.matcher(line);
     MatchResult result = matcher.toMatchResult();
     songMap.put(result.group(1), result.group(3));
  }
  int count = 0, rating = 0;
  try{
     count = Integer.parseInt(songMap.get("Play Count"));
  }
  catch(Exception e)
  {
     //bury this for now will handle when rest is working
  }
  try{
     rating = Integer.parseInt(songMap.get("Rating"));
  }
  catch(Exception e)
  {
     //bury this for now will handle when rest is working
  }
  return new Song(songMap.get("Name"), songMap.get("Artist"), songMap.get("Album"),
        songMap.get("Genre"), count, rating, songMap.get("Location"));
公共静态歌曲解析歌曲(String-songString){
Map songMap=新的HashMap();
Pattern=Pattern.compile(“.*(.+)(.+).*\n”);
扫描器=新扫描器(歌曲串);
if(scanner.hasNext(模式))
{
字符串行=扫描器。下一步(模式);
匹配器匹配器=模式匹配器(线);
MatchResult=matcher.toMatchResult();
songMap.put(结果组(1),结果组(3));
}
整数计数=0,额定值=0;
试一试{
count=Integer.parseInt(songMap.get(“播放计数”));
}
捕获(例外e)
{
//现在就把这个埋起来,等剩下的工作完成后再处理
}
试一试{
rating=Integer.parseInt(songMap.get(“rating”);
}
捕获(例外e)
{
//现在就把这个埋起来,等剩下的工作完成后再处理
}
返回新歌(songMap.get(“名称”)、songMap.get(“艺术家”)、songMap.get(“专辑”),
songMap.get(“流派”)、计数、评级、songMap.get(“位置”);
}

String songString=“曲目ID160\n”+
“NameAshley\n”+
“艺人面对命运\n”+
“作曲家卢卡·古斯拉\n”+
“这场战争是我们的\n”+
“GenreMetal\n”+
“KindAAC音频文件\n”+
“大小7968219\n”+
“总时间246503\n”+
“曲目编号17\n”+
“2005年\n”+
“日期修改2009-07-27T01:17:29Z\n”+
“添加日期2009-07-27T01:17:00Z\n”+
“播放计数150\n”+
“比特率256\n”+
“采样率44100\n”+
“评论\“Amanda\”由Aisha Duo从CD安静歌曲中演唱,由Obliq Sound提供。由Luca Gusella编写,由ObliqMusic(GEMA)出版。保留所有权利。经许可使用。\n”+
“跳过计数1\n”+
“跳过日期2009-07-27T01:46:32Z\n”+
“艺术品计数1\n”+
“持久性IDA4D6F35FE9F41B58\n”+
“跟踪类型文件\n”+
“Locationfile://localhost/C:/Documents%20and%20Settings/MB24244/Desktop/music/07%20Knees.m4a\n“+
“文件文件夹计数4\n”+
“AFGJDHFSHSGSUGHANOISE\n”+
“库文件夹计数1\n”+
“评级100”;

谁能帮我解释一下我的方法有什么问题,以及为什么小组不工作(这似乎是问题所在)

为什么不使用XML解析器来解析XML

尽管看XML示例,它并没有那么好,因为它本质上是建模一个
映射
,而不是建模一个

查看正则表达式为什么要查找以
\n
结尾的行。看起来您正在依次匹配每一行,我不相信这些将包含新行字符

然而,这种不使用扫描仪的方法是可行的。请注意,我已经更改了正则表达式以删除行尾

    Map<String, String> songMap = new HashMap<String, String>();

    Pattern pattern = Pattern
            .compile(".*<key>(.+)</key><(.+)>(.+)</.+>.*");

    String[] lines = songString.split("\n");

    for (String line : lines) {
        Matcher matcher = pattern.matcher(line);
        if (matcher.matches()) {
            songMap.put(matcher.group(1), matcher.group(3));
        }
    }
Map songMap=newhashmap();
图案
.compile(“.*(.+)(.+)*”);
String[]line=songString.split(“\n”);
用于(字符串行:行){
匹配器匹配器=模式匹配器(线);
if(matcher.matches()){
放(匹配器组(1),匹配器组(3));
}
}

您可能也可以让它与扫描仪一起工作。

为什么不使用XML解析器来解析XML

尽管看XML示例,它并没有那么好,因为它本质上是建模一个
映射
,而不是建模一个

查看正则表达式为什么要查找以
\n
结尾的行。看起来您正在依次匹配每一行,我不相信这些将包含新行字符

然而,这种不使用扫描仪的方法是可行的。请注意,我已经更改了正则表达式以删除行尾

    Map<String, String> songMap = new HashMap<String, String>();

    Pattern pattern = Pattern
            .compile(".*<key>(.+)</key><(.+)>(.+)</.+>.*");

    String[] lines = songString.split("\n");

    for (String line : lines) {
        Matcher matcher = pattern.matcher(line);
        if (matcher.matches()) {
            songMap.put(matcher.group(1), matcher.group(3));
        }
    }
Map songMap=newhashmap();
图案
.compile(“.*(.+)(.+)*”);
String[]line=songString.split(“\n”);
用于(字符串行:行){
匹配器匹配器=模式匹配器(线);
if(matcher.matches()){
放(匹配器组(1),匹配器组(3));
}
}

您可能也可以让它与扫描器一起工作。

投票支持将XML转换为有效的XML(单个顶级节点),然后使用XML解析器


但我会怀疑\n最后的问题,不确定Java的正则表达式库有多喜欢这样?

第二次投票支持将XML转换为有效的XML(单个顶级节点),然后使用XML解析器


但我会怀疑\n最后,不确定Java的正则表达式库有多少是这样的?

不要尝试编写解析器,除非您已经知道要解析的文件的规则

您编写的正则表达式没有遵循XML文件的很多规则


如果这是您第一次编写正则表达式,您可能应该尝试学习一些更容易解析的东西。甚至可能是您自己创建的简单文件格式。

不要尝试编写解析器,除非您已经知道要解析的文件的规则

if(scanner.hasNext(pattern))
{
   String line = scanner.next(pattern);
   Matcher matcher = pattern.matcher(line);
   matcher.toMatchResult();
   songMap.put(result.group(1), result.group(3));
}
您编写的正则表达式没有遵循XML文件的很多规则

如果这是您第一次编写正则表达式,您可能应该尝试学习一些更容易解析的东西。甚至可能是您自己创建的简单文件格式

if(scanner.hasNext(pattern))
{
   String line = scanner.next(pattern);
   Matcher matcher = pattern.matcher(line);
   matcher.toMatchResult();
   songMap.put(result.group(1), result.group(3));
}
你用pattern.matcher(line)创建的matcher是一个全新的对象,它不知道你刚刚用扫描仪找到的匹配。你想要的是:

MatchResult result = scanner.match();
这个正则表达式也需要一些工作。如果每条记录都显示在自己的行上,则不需要在其两端填充
“*”
,也不需要匹配换行符。另外,我建议您使用
“+?”
而不是
“+”
,无论它出现在哪里。因为这个原因

使用pattern.matcher(line)创建的matcher是一个全新的对象,它对match一无所知