我正在尝试验证应该是有效注释的用户输入。在音乐中,音符是字母 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
附言E# 和 B# 在音乐中不存在,所以我必须将其编程到我的代码中。
最佳答案
你的正则表达式:
([A-G]{1})(\#|b{1})?
是正确的。
要使您的演示正常运行,您需要删除 x
修饰符,因为它会影响 #
字符(实际上这是一个令人困惑的修饰符)。当您删除它时,它会显示您的正则表达式有效( updated demo here )。
关于 x
修饰符:
x
modifier: Ignore whitespaceThis flag tells the engine to ignore all whitespace and allow for comments in the regex. Comments are indicated by a starting "
#
"-character.
现在,如果可以的话,您可以通过删除那些 {1}
来简化它,它们是多余的(它们默认已经匹配一次)。此外,如 CSᵠ 所述(参见 comment below ),#
不需要转义然后 \#|b
可以变成 [#b]
:
([A-G])([#b])?
当然,如果您不需要单独匹配音符(第一组)或升/降符号(第二组),您也可以删除括号。
除此之外,您可以添加 gm
修饰符来测试多行:DEMO here .
奖励:
您不必编程,您可以不仅使用正则表达式匹配E#
和B#
:
(?![EB]#)([A-G])([#b])?
This demo显示它工作。 (?! ... )
被称为 negative lookahead .
关于regex - 如何使用正则表达式验证音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34100192/