【发布时间】:2017-08-17 15:25:52
【问题描述】:
我正在开发吉他和弦转置器,因此我想从给定的文本文件中识别吉他和弦。例如G#、Ab、F#m 等
我快到了!由于数字符号(哈希标签),我已经遇到了一些问题。
#
例如,您不能在正则表达式模式中包含数字符号。 NSRegularExpression 不会这样初始化:
let fail: String = "\\b[ABCDEFG](b|#)?\\b"
let success: String = "\\b[CDEFGAB](b|\\u0023)?\\b"
我必须专门提供 unicode 字符。我可以忍受。
但是,现在我有一个 NSRegularExpression 对象,当我有一行文本时,它不会匹配这些(锐器 = 数字符号):
Am Bb G# C Dm F E
当它开始处理 G# 时,与第二个捕获组关联的锐利不匹配。 (即 NSTextCheckingResult 的第二个范围的位置为 NSNotFound)注意,它适用于 Bb...它匹配 'b'
我想知道我需要在这里做什么。似乎文档没有涵盖“#”的这种情况,实际上有时在正则表达式模式中使用它(我认为与 cmets 或某事有关)
最好的一点是不必查找# 的unicode 标识符,而只需将其用作字符串“#”,然后将其转换为与模式很好地配合。有可能 \u0023 实际上不是与 # ... 关联的代码
【问题讨论】:
-
数字符号和尖号不一样吗?
-
让我准确地说:你不想匹配
Eddd?F#7呢?根本原因很清楚,但解决方案需要针对这种特定类型的输入进行定制。并尝试"\\b[CDEFGAB][bm\\u0023]?(?!\\w)"。或\\b[CDEFGAB][bm\\u0023]?+(?!\\w)。不确定什么最适合这里。请检查。 -
请检查我上面的 2 个解决方案,让知道哪一个效果最好。
-
@SumnerEvans 我的代码最终将支持两者,但我在这里是面向用户的。大多数人写 'b' 表示平号(键盘上没有平号!),#(数字符号)表示尖号(还有一个尖号)
-
@WiktorStribiżew 请不要想太多。为简洁起见,我缩短了代码。我有另一个处理和弦结构的捕获组,效果很好。问题是关于匹配 # 符号。现在,我只是让这个例子简洁。现在我在乎这张纸条。
标签: ios regex swift unicode nsregularexpression