首先,我尝试使用正则表达式从一个简单的文本文件中提取所有吉他和弦。对我来说,它是在https://regexr.com/上工作,但是它在java中不能正常工作。
在这个(简化)任务中,一个和弦
我正在使用NetBeans8.2IDE。我尝试了以下代码片段:
try (BufferedReader br = new BufferedReader(new FileReader(textFile))) {
while ((line = br.readLine()) != null) {
Pattern p = Pattern.compile("\\b[CDEFGAB](([#b](?=\\s))|([#b]m7\\b)|([#b][m7]\\b)|(m7\\b)|([m7]\\b)|(\\b))");
Matcher m = p.matcher(line);
while (m.find()) {
chords.add(m.group());
}
}
}我的和弦最多,但不是以#结尾的和弦,而是站在一行的末尾。也就是说,我在这里只看到"F“(而不是"F#"):
"C# F#\n"
它可能是一个很好的文本:1080047
发布于 2019-08-22 11:30:39
你敏锐的表情是在它后面找一个空格。一行中的最后一和弦与之不匹配。您可以在行中添加一个空格。
Matcher m = p.matcher(line + " ");或者向正则表达式([#b]$)添加额外的条件,并确保将$设置为与使用Pattern.MULTILINE的字符串末尾匹配的新行。
Pattern p = Pattern.compile("\\b[CDEFGAB](([#b]$)|([#b](?=\\s))|([#b]m7\\b)|([#b][m7]\\b)|(m7\\b)|([m7]\\b)|(\\b))", Pattern.MULTILINE);发布于 2019-08-22 11:50:46
您可以用一个简单得多的正则表达式来完成这个任务:
Pattern.compile("\\b[A-G][b#]?m?7?(?!\\w)")这应该能满足你的需要。你甚至可以扩展它(吉他也有大调和第七和弦,对吗?)
Pattern.compile("\\b[A-G][b#]?(7|m7?|M7|dim7?)?(?!\\w)")https://stackoverflow.com/questions/57608080
复制相似问题