如何用正则表达式验证音符

时间:2015-12-05 01:25:10

标签: regex

我正在尝试验证应该是有效注释的用户输入。在音乐中,音符是字母A-G,可以是尖锐的(#)或扁平的(b)。注释不必是尖锐或平坦的,它们可以是自然的。为什么这个正则表达式与任何音符中的#或b都不匹配?这是regex101 demo

([A-G]{1})(\#|b{1})?

以下是应匹配的所有输入的列表:

A
A#
Ab
B
Bb
C
C#
Cb
D
D#
Db
E
Eb
F
F#
Fb
G
G#
Gb

P.S。音乐中不存在E#和B#,因此我必须将其编入我的代码中。

2 个答案:

答案 0 :(得分:3)

你的正则表达式:

([A-G]{1})(\#|b{1})?

是对的。

要使您的演示工作,您需要删除x修饰符,因为它会影响#字符(实际上它是一个令人困惑的修饰符)。当您删除它时,它会显示您的正则表达式(updated demo here)。

关于x修饰符:

  

x修饰符:忽略空格

     

此标志告诉引擎忽略所有空格并允许正则表达式中的注释。评论以首字母“#”表示。

现在,如果可以,您可以通过删除{1}来简化它们,它们是多余的(它们默认是匹配一次)。另外,正如CSᵠ所述(请参阅comment below),#不需要转义,然后\#|b可能会成为[#b]

([A-G])([#b])?

当然,如果您不需要单独匹配音符(第一组)或尖锐/扁平符号(第二组),也可以删除括号。

除此之外,您可以添加gm修饰符来测试多行:DEMO here

加成:

您无需编程,只能使用正则表达式 匹配E#B#

(?![EB]#)([A-G])([#b])?

This demo显示它有效。 (?! ... )被称为negative lookahead

答案 1 :(得分:0)

您必须包含锚点,并且还必须启用多线修改器m

^([A-G]{1})(\#|b{1})?$

^[A-G][#b]?$

DEMO