正则表达式仅返回新行字符之前的数字

标签 regex swift

我有这样的文本,我只需要提取第一行的数字

+1-415-655-0001 美国长途电话 接入码:197 703 792

我的正则表达式刚刚提取了所有数字 /d+

var noteStr = "1-415-655-0001 US TOLL\n\nAccess code: 197 703 792"

findCodeInWord()

func findCodeInWord() -> String?
{
    let regex = try! NSRegularExpression(pattern: "\\d+", options: [])

    var items = [String]()
    regex.enumerateMatchesInString(noteStr, options: [], range: NSMakeRange(0, noteStr.characters.count)) { result, flag, stop in
        guard let match = result else {
            // result is nil
            return
        }

        let range = match.rangeAtIndex(0)
        var matchStr = (noteStr as NSString).substringWithRange(range)
        print(matchStr)
    }
    return items.joinWithSeparator("")

}

但这会返回所有数字。我只想让它返回 14156550001

最佳答案

您可以使用基于 \G 运算符的单个正则表达式提取这些数字,并将数字捕获到第 1 组中:

\G(?:[^\d\n\r]*(\d+))

请参阅regex demo ,由于 \G 运算符与字符串的开头,然后是每次成功匹配的末尾,[^\d\n\r]* 字符类匹配除数字、LF 或 CR 之外的 0+ 个字符。

因此,当开始匹配时,1被找到并捕获,然后-[^\d\n\r]*,然后匹配并捕获415等。当遇到\n时,找不到更多匹配,则\G anchor 失败因此,整个正则表达式搜索停止在第一行。

swift :

let regex = try! NSRegularExpression(pattern: "\\G(?:[^\\d\n\r]*(\\d+))", options: [])
...
let range = match.rangeAtIndex(1)

关于正则表达式仅返回新行字符之前的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36558430/

相关文章:

python - 我想知道 python 的 re lib 中正则表达式匹配的最后一个索引

ios - 附加带有计算的纬度和经度的 Json 数组

ios - 如何让 iOS 应用程序在 iPhone 5、iPhone 6 和 iPhone 6+ 上看起来一样

ios - 从 Firebase Swift 读取通过 Autoid 存储的数据

ios - 在 iOS 上不一致地处理表情符号序列?

android - 在 Android 中存储和使用依赖于语言环境的正则表达式的最佳方式是什么?

java.util.regex.Pattern 与在线正则表达式调试器不一致

swift - 表达式类型 '()' 在没有更多 XCTAssertEqual 上下文的情况下不明确

javascript - 正则表达式选择不包含连字符的术语

ruby - 在匹配特定条件时拆分字符串