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

标签 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

附言E# 和 B# 在音乐中不存在,所以我必须将其编程到我的代码中。

最佳答案

你的正则表达式:

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

是正确的。

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

关于 x 修饰符:

x modifier: Ignore whitespace

This 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/

相关文章:

ruby - 奇怪,在 irb 中执行两次时相同的表达式产生不同的值

regex - 删除具有缺失值的数据框列中字符串后的所有内容

regex - VBScript 的正则表达式负回溯替代方案

python - 需要重新审视 Python assertRegexpMatches

javascript - 使用 jQuery 防止 html 输入中的值

regex - Notepad++ 使用正则表达式为 Styler 配置定义的新关键字

用于用户名验证的正则表达式模式

regex - Vim - E488 错误 - 搜索和替换命令中的尾随字符

c++ - CMake 正则表达式匹配包含声明中的 header 名称

python - 时间戳的正则表达式