Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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 来自正则表达式的Swift 3提取组-NS_Ios_Swift_Swift3 - Fatal编程技术网

Ios 来自正则表达式的Swift 3提取组-NS

Ios 来自正则表达式的Swift 3提取组-NS,ios,swift,swift3,Ios,Swift,Swift3,我正在尝试用Swift 3做一个简单的正则表达式,从输入字符串中提取一个数字 由于我对iOS不熟悉,这被证明是一个相当大的挑战。我高度怀疑我的错误在于同时使用String和NSString let url = "a5b" let nsUrl = url as NSString let regex = try! NSRegularExpression(pattern: "a(\\d)b", options: []) let matches = regex.matches(in: url, opt

我正在尝试用Swift 3做一个简单的正则表达式,从输入字符串中提取一个数字

由于我对iOS不熟悉,这被证明是一个相当大的挑战。我高度怀疑我的错误在于同时使用
String
NSString

let url = "a5b"
let nsUrl = url as NSString

let regex = try! NSRegularExpression(pattern: "a(\\d)b", options: [])
let matches = regex.matches(in: url, options: [], range: NSRange(location: 0, length: url.characters.count))

somestuff(str: nsUrl.substring(with: matches[1].range))
失败,出现以下异常:

由于未捕获的异常“NSRangeException”而终止应用程序,原因:'***-[\uu\NSSingleObjectArrayI objectAtIndex:]:索引1超出边界[0..0]'


匹配和获取数字的正确方法是什么?

索引以零为基础,但捕获的组位于范围索引1处

somestuff(str: nsUrl.substring(with: matches[0].rangeAt(1)))
无论如何,你应该测试没有匹配项


关于
匹配项的返回值(在
中):

NSTextCheckingResult
对象的数组。每个结果通过其
range
属性给出整体匹配范围,并通过其
rangeAt(:)
方法给出每个捕获组的范围。范围
{NSNotFound,0}如果其中一个捕获组未参与此特定匹配,则返回


注意:
range
实际上与
rangeAt(0)

索引是零基的,但捕获的组位于range索引1

somestuff(str: nsUrl.substring(with: matches[0].rangeAt(1)))
无论如何,你应该测试没有匹配项


关于
匹配项的返回值(在
中):

NSTextCheckingResult
对象的数组。每个结果通过其
range
属性给出整体匹配范围,并通过其
rangeAt(:)
方法给出每个捕获组的范围。范围
{NSNotFound,0}如果其中一个捕获组未参与此特定匹配,则返回


注意:
range
实际上与
rangeAt(0)

匹配[0]给我a5b(整个输入),与Java中的相同。谢谢,这很有效,将尽快接受。您介意详细介绍一下为什么需要这样做吗?我不太理解API。它提供了一个匹配数组,从逻辑上讲,人们希望在匹配项[1]中找到捕获组。为什么
rangeAt
“返回范围所代表的结果类型”表示捕获组的范围超出了我的理解范围。@Zackline:如果输入字符串是
“a5b c6d”
,则
匹配[0]
指第一个匹配“a5d”,而
匹配[1]
指第二个匹配“c6d”。在每个匹配中,
.rangeAt(1)
指的是第一个捕获组。谢谢大家,我理解。但是我仍然不理解
范围
上的文档。如果它被称为
,我会立即知道它的功能。查看
范围
我在阅读
后丢弃了它,返回范围所代表的结果类型。
它是否返回任何类型?文档是否应该不是
之类的东西?返回给定索引处的范围
?匹配[0]给我a5b(整个输入),与Java中的相同。谢谢,这很有效,将尽快接受。您介意详细说明一下为什么需要这样做吗?我不太理解API。它提供了一个匹配数组,从逻辑上讲,人们希望在匹配项[1]中找到捕获组。为什么
rangeAt
that“返回范围表示的结果类型“为您提供了我无法理解的捕获组范围”。@Zackline:如果您的输入字符串是
“a5b c6d”
,则
匹配[0]
指第一个匹配“a5d”,而
匹配[1]
指第二个匹配“c6d”。在每个匹配中,
.rangeAt(1)
指的是第一个捕获组。谢谢大家,我理解。但是我仍然不理解
范围
上的文档。如果它被称为
,我会立即知道它的功能。查看
范围
我在阅读
后丢弃了它,返回范围所代表的结果类型。
它是否返回任何类型?文档是否应该不是类似于
返回给定索引的范围
?这在示例数据中可能并不重要,但
url.characters.count
需要更改为
url.utf16.count
NSRegularExpression
使用基于UTF-16的位置和长度。This在示例数据中可能不重要,但需要将
url.characters.count
更改为
url.utf16.count
NSRegularExpression
使用基于UTF-16的位置和长度。