解析QIF文件-.NET移植到Java

解析QIF文件-.NET移植到Java,java,regex,parsing,Java,Regex,Parsing,我有使用.NET解析.qif文件的代码。我试图将这段代码移植到Java,但在执行部分解析的正则表达式方面遇到了问题。以下是文件开头的示例: !Type:Tag NAdam DSon ^ NAllison ^ NAmber DSabrina's Sister ^ NAnthony ^ 在.NET中,我可以使用以下代码开始解析: // Read the entire file string input = reader.ReadToEnd(); // Split the file by head

我有使用.NET解析.qif文件的代码。我试图将这段代码移植到Java,但在执行部分解析的正则表达式方面遇到了问题。以下是文件开头的示例:

!Type:Tag
NAdam
DSon
^
NAllison
^
NAmber
DSabrina's Sister
^
NAnthony
^
在.NET中,我可以使用以下代码开始解析:

// Read the entire file
string input = reader.ReadToEnd();

// Split the file by header types
string[] transactionTypes = Regex.Split(input, @"^(!.*)$", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
调试.NET解析器时,我看到以下内容:

transactionTypes[0] = ""
transactionTypes[1] = "!Type:Tag\r"
transactionTypes[2] = "\nNAdam\r\nDSon\r\n^\r\nNAllison\r\n^NAmber\r\nDSabrina's Sister\r\nNAnthony\r\n^
String[] transactionTypes = dataToParse.split("!.*");
String[] transactionTypes = dataToParse.split("\\s*^(!.*)\\s*");
String[] transactionTypes = dataToParse.split("\\s*(?m)^(!.*)$\\s*");
在Java中,它似乎总是跳过!Type:标记行,所以我不知道要分析的类型。我在Java中尝试了各种版本的正则表达式,包括:

transactionTypes[0] = ""
transactionTypes[1] = "!Type:Tag\r"
transactionTypes[2] = "\nNAdam\r\nDSon\r\n^\r\nNAllison\r\n^NAmber\r\nDSabrina's Sister\r\nNAnthony\r\n^
String[] transactionTypes = dataToParse.split("!.*");
String[] transactionTypes = dataToParse.split("\\s*^(!.*)\\s*");
String[] transactionTypes = dataToParse.split("\\s*(?m)^(!.*)$\\s*");
当我说它跳过了这一步!Type:tagline,调试时我看到了以下内容:

transactionTypes[0] = ""
transactionTypes[1] = "\nNAdam\r\nDSon\r\n^\r\nNAllison\r\n^NAmber\r\nDSabrina's Sister\r\nNAnthony\r\n^

感谢您的帮助!提前谢谢你

您确定需要正则表达式吗?从我收集的.qif格式来看,它看起来更像是为逐行阅读而设计的。读一行,如果它以!这是一个标题行,然后以下几行是一个对象,其中一行由^组成,作为对象之间的分隔符,等等。在这个SO线程中,有很多逐行读取文件的示例:


“拆分”会删除匹配的拆分器,这就是您的匹配项消失的原因。?看起来“拆分”总是会消耗一些东西,所以如果您想要一个不需要的拆分器,您可能需要自己滚动。@BevynQ解释了这一点!如果你把它写下来作为回答,我会接受的。