Ios NSRegularExpression与数字符号(#)不匹配
我正在研究一个吉他和弦转发器,所以从给定的文本文件中,我想识别吉他和弦。e、 g、g、Ab、F、m等 我快到了!由于数字符号(散列标签),我已经遇到了一些问题 # 例如,您不能在正则表达式模式中包含数字符号。NSRegularExpression将不会使用以下命令初始化:Ios NSRegularExpression与数字符号(#)不匹配,ios,regex,swift,unicode,nsregularexpression,Ios,Regex,Swift,Unicode,Nsregularexpression,我正在研究一个吉他和弦转发器,所以从给定的文本文件中,我想识别吉他和弦。e、 g、g、Ab、F、m等 我快到了!由于数字符号(散列标签),我已经遇到了一些问题 # 例如,您不能在正则表达式模式中包含数字符号。NSRegularExpression将不会使用以下命令初始化: let fail: String = "\\b[ABCDEFG](b|#)?\\b" let success: String = "\\b[CDEFGAB](b|\\u0023)?\\b" 我必须专门提供unicode
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”匹配
我想知道我在这里需要做什么。文档似乎没有涵盖“#”这种情况,事实上它有时在正则表达式模式中使用(我认为与注释或其他相关)
最好的一件事是不必为#查找unicode标识符,只需将其用作字符串“#”,然后将其转换为与模式配合良好的字符串。有可能\u0023实际上不是与#关联的代码 这个\b
是一个上下文相关的结构。它在4种上下文中匹配:1)字符串开头和单词字符,2)单词字符和字符串结尾,3)单词和非单词,4)非单词和单词字符
您的正则表达式是这样编写的:正则表达式引擎最终会在
之后看到一个\b
,这意味着
只有在后面有一个单词char时才会匹配
如果将\b
替换为(?!\w)
,则如果当前位置右侧有一个单词char,则会出现不匹配的负前瞻,它将起作用
因此,您可以使用
\\b[CDEFGAB](b|\\u0023)?(?!\\w)
看
详细信息
-单词边界\b
-集合中的字符[CDEFGAB]
-可选的(b|\\u0023)?
或b
-如果在当前位置的右侧有一个单词字符,则会导致匹配失败(并导致回溯到前面的模式!为避免这种情况,请在(?!\\w)
之后添加?
,以防止回溯到该模式)+
之后看到一个\b
,这意味着
只有在后面有一个单词char时才会匹配
如果将\b
替换为(?!\w)
,则如果当前位置右侧有一个单词char,则会出现不匹配的负前瞻,它将起作用
因此,您可以使用
\\b[CDEFGAB](b|\\u0023)?(?!\\w)
看
详细信息
-单词边界\b
-集合中的字符[CDEFGAB]
-可选的(b|\\u0023)?
或b
-如果在当前位置的右侧有一个单词字符,则会导致匹配失败(并导致回溯到前面的模式!为避免这种情况,请在(?!\\w)
之后添加?
,以防止回溯到该模式)+
a->G
之间的一个字母和一个称为意外的可选符号组成。(音符与播放该音符时听到的声音的声学频率有关)偶然的音调可以是平坦的(表示为♭代码>或简单的ab
),或asharp(表示为a♯
或简单的#
,因为它们更容易在键盘上键入)。一个偶然的音符用来使一个音符的半音变高(#)或变低(b)。因此,F#是与Gb相同的声学频率。在钢琴上,白键表示没有意外的音符,黑键表示有意外的音符。根据乐曲的某些因素,该乐曲不会混合偶然的类型。它可以是整件作品中的扁平部分,也可以是尖锐部分。(取决于乐曲的音乐键,但这与此处无关。)
就正则表达式而言,你有类似ABCDEFG的东西吗?确定注释。事实上,它更复杂
然后,一个音乐的和弦由根音符及其和弦类型组成。和弦有50多种类型。他们有一个独特的“文本签名”。此外,“大调”和弦的签名为空。因此,就弦的伪正则表达式而言:
[ABCDEFG](b |#)?(…|…|…)?
第一部分识别为音符(如前所述),最后一部分是确定和弦类型。省略了不同的类型,但可以像m
(用于小和弦)或一样简单