首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么java给吉他和弦不同的结果?

为什么java给吉他和弦不同的结果?
EN

Stack Overflow用户
提问于 2019-08-22 11:13:17
回答 2查看 191关注 0票数 3

首先,我尝试使用正则表达式从一个简单的文本文件中提取所有吉他和弦。对我来说,它是在https://regexr.com/上工作,但是它在java中不能正常工作。

在这个(简化)任务中,一个和弦

  • 应该以大写字母(CDEFGAB)开头(它总是必需的)
  • 后面可以是#或b(只是其中之一)。
  • 它也可以是m,7,或m7 (只是其中之一)。
  • 如果存在#或b,则在m、7或m7之前
  • 和弦不应该被一个单词字符所限制(例如,"\nA#7“就是一个很好的例子)

我正在使用NetBeans8.2IDE。我尝试了以下代码片段:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-22 11:30:39

你敏锐的表情是在它后面找一个空格。一行中的最后一和弦与之不匹配。您可以在行中添加一个空格。

代码语言:javascript
复制
  Matcher m = p.matcher(line + " ");

或者向正则表达式([#b]$)添加额外的条件,并确保将$设置为与使用Pattern.MULTILINE的字符串末尾匹配的新行。

代码语言:javascript
复制
   Pattern p = Pattern.compile("\\b[CDEFGAB](([#b]$)|([#b](?=\\s))|([#b]m7\\b)|([#b][m7]\\b)|(m7\\b)|([m7]\\b)|(\\b))", Pattern.MULTILINE);
票数 3
EN

Stack Overflow用户

发布于 2019-08-22 11:50:46

您可以用一个简单得多的正则表达式来完成这个任务:

代码语言:javascript
复制
Pattern.compile("\\b[A-G][b#]?m?7?(?!\\w)")

这应该能满足你的需要。你甚至可以扩展它(吉他也有大调和第七和弦,对吗?)

代码语言:javascript
复制
Pattern.compile("\\b[A-G][b#]?(7|m7?|M7|dim7?)?(?!\\w)")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57608080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档