我正在尝试验证应该是有效注释的用户输入。在音乐中,音符是字母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#,因此我必须将其编入我的代码中。
答案 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)