Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSRegularExpression与数字符号(#)不匹配_Ios_Regex_Swift_Unicode_Nsregularexpression - Fatal编程技术网

Ios 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

我正在研究一个吉他和弦转发器,所以从给定的文本文件中,我想识别吉他和弦。e、 g、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”匹配

我想知道我在这里需要做什么。文档似乎没有涵盖“#”这种情况,事实上它有时在正则表达式模式中使用(我认为与注释或其他相关)

最好的一件事是不必为#查找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是一个上下文相关的结构。它在4种上下文中匹配:1)字符串开头和单词字符,2)单词字符和字符串结尾,3)单词和非单词,4)非单词和单词字符

您的正则表达式是这样编写的:正则表达式引擎最终会在
之后看到一个
\b
,这意味着
只有在后面有一个单词char时才会匹配

如果将
\b
替换为
(?!\w)
,则如果当前位置右侧有一个单词char,则会出现不匹配的负前瞻,它将起作用

因此,您可以使用

\\b[CDEFGAB](b|\\u0023)?(?!\\w)

详细信息

  • \b
    -单词边界
  • [CDEFGAB]
    -集合中的字符
  • (b|\\u0023)?
    -可选的
    b
  • (?!\\w)
    -如果在当前位置的右侧有一个单词字符,则会导致匹配失败(并导致回溯到前面的模式!为避免这种情况,请在
    之后添加
    +
    ,以防止回溯到该模式)
(我想首先说@WiktorStribiżew帮了大忙,没有他我现在写的东西是不可能的!我不关心StackOverflow points和rep,所以如果你喜欢这个答案,请投票支持他的答案。)

这一问题发生了多次变化,并出现了一些问题。最终,这个问题应该称为如何在iOS上使用Regex来检测文本文件中的和弦?

答案(到目前为止)并不简单

音乐理论速成班

在音乐中你有音符。它们由
a->G
之间的一个字母和一个称为意外的可选符号组成。(音符与播放该音符时听到的声音的声学频率有关)偶然的音调可以是平坦的(表示为
或简单的a
b
),或asharp(表示为a
或简单的
#
,因为它们更容易在键盘上键入)。一个偶然的音符用来使一个音符的半音变高(#)或变低(b)。因此,F#是与Gb相同的声学频率。在钢琴上,白键表示没有意外的音符,黑键表示有意外的音符。根据乐曲的某些因素,该乐曲不会混合偶然的类型。它可以是整件作品中的扁平部分,也可以是尖锐部分。(取决于乐曲的音乐键,但这与此处无关。)

就正则表达式而言,你有类似ABCDEFG的东西吗?确定注释。事实上,它更复杂

然后,一个音乐的和弦由根音符及其和弦类型组成。和弦有50多种类型。他们有一个独特的“文本签名”。此外,“大调”和弦的签名为空。因此,就弦的伪正则表达式而言:

[ABCDEFG](b |#)?(…|…|…)?

第一部分识别为音符(如前所述),最后一部分是确定和弦类型。省略了不同的类型,但可以像
m
(用于小和弦)或
一样简单