Regex “快速拆分”;abc1.23.456.7890xyz“;变成;“abc”&引用;“1”&引用;“23”&引用;456“&引用;7890“;及;xyz";

Regex “快速拆分”;abc1.23.456.7890xyz“;变成;“abc”&引用;“1”&引用;“23”&引用;456“&引用;7890“;及;xyz";,regex,macos,swift2,nsregularexpression,Regex,Macos,Swift2,Nsregularexpression,在操作系统X上的Swift中,我试图将字符串“abc1.23.456.7890xyz”拆分为以下字符串: "abc" "1" "23" "456" "7890" "xyz" 但是,当我运行以下代码时,我得到以下结果: => "abc1.23.456.7890xyz" (0,3) -> "abc" (3,1) -> "1" (12,4) -> "7890" (16,3) -> "xyz" 这意味着应用程序正确地找到了“abc”,第一个标记“1”,但找到的下一个标记

在操作系统X上的Swift中,我试图将字符串“abc1.23.456.7890xyz”拆分为以下字符串:

"abc"
"1"
"23"
"456"
"7890"
"xyz"
但是,当我运行以下代码时,我得到以下结果:

=> "abc1.23.456.7890xyz"
(0,3) -> "abc"
(3,1) -> "1"
(12,4) -> "7890"
(16,3) -> "xyz"
这意味着应用程序正确地找到了“abc”,第一个标记“1”,但找到的下一个标记是“7890”(遗漏了“23”和“456”),后面是“xyz”

有人知道如何更改代码以查找所有字符串(包括“23”和“456”)

非常感谢

import Foundation
import XCTest

public
class StackOverflowTest: XCTestCase {
    public
    func testRegex() {
        do {
            let patternString = "([^0-9]*)([0-9]+)(?:\\.([0-9]+))*([^0-9]*)"
            let regex = try NSRegularExpression(pattern: patternString, options: [])

            let string = "abc1.23.456.7890xyz"
            print("=> \"\(string)\"")

            let range = NSMakeRange(0, string.characters.count)
            regex.enumerateMatchesInString(string, options: [], range: range) {
                (textCheckingResult, _, _) in
                if let textCheckingResult = textCheckingResult {
                    for nsRangeIndex in 1 ..< textCheckingResult.numberOfRanges {
                        let nsRange = textCheckingResult.rangeAtIndex(nsRangeIndex)
                        let location = nsRange.location
                        if location < Int.max {
                            let startIndex = string.startIndex.advancedBy(location)
                            let endIndex = startIndex.advancedBy(nsRange.length)
                            let value = string[startIndex ..< endIndex]
                            print("\(nsRange) -> \"\(value)\"")
                        }
                    }
                }
            }
        } catch {
        }
    }
}
<代码>导入基础 导入测试 公众的 类StackOverflowTest:XCTestCase{ 公众的 func testRegex(){ 做{ let patternString=“([^0-9]*)([0-9]+)(?:\.([0-9]+)*([^0-9]*)” 让regex=尝试NSRegularExpression(模式:patternString,选项:[]) let string=“abc1.23.456.7890xyz” 打印(“=>\”\(字符串)\”) let range=NSMakeRange(0,string.characters.count) regex.EnumerateMatchesInstalling(字符串,选项:[],范围:range){ (textCheckingResult,u,u)在 如果让textCheckingResult=textCheckingResult{ 对于1..\”\(值)\”) } } } } }抓住{ } } }
这都是关于正则表达式模式的。您希望查找一系列连续的字母或数字。请尝试以下模式:

let patternString = "([a-zA-Z]+|\\d+)"

另一种“快速”方式

let str = "abc1.23.456.7890xyz"
let chars = str.characters.map{ $0 }

enum CharType {
    case Number
    case Alpha
    init(c: Character) {
        self = .Alpha
        if isNumber(c) {
            self = .Number
        }
    }
    func isNumber(c: Character)->Bool {
        return "1234567890".characters.map{ $0 }.contains(c)
    }    
}

var tmp = ""
tmp.append(chars[0])
var type = CharType(c: chars[0])

for i in 1..<chars.count {
    let c = CharType(c: chars[i])

    if c != type {
        tmp.append(Character("."))
    }
    tmp.append(chars[i])
    type = c
}
tmp.characters.split(".", maxSplit: Int.max, allowEmptySlices: false).map(String.init)
// ["abc", "1", "23", "456", "7890", "xyz"]
让str=“abc1.23.456.7890xyz” 设chars=str.characters.map{$0} 枚举图表类型{ 案件编号 案例阿尔法 初始化(c:字符){ self=.Alpha 如果是数字(c){ self=.Number } } func isNumber(c:字符)->Bool{ 返回“1234567890”.characters.map{$0}.contains(c) } } var tmp=“” tmp.append(字符[0]) 变量类型=图表类型(c:chars[0])
对于我来说,这无疑是一个巨大的进步。但对我来说,它并不完全存在,因为尽管字符串“abc1.23.456.7890xyz”正确地拆分为“abc”、“1”、“23”、“456”、“7890”和“xyz”,字符串“1.23.456.7890xyz”应该返回“、”1“、”23“、”456“、”7890”和“xyz”,但返回的是“1”、“23”、“456”、“7890”和“xyz”。类似地,字符串“1.23.456.7890”应返回“、”1“、”23“、”456“、”7890”和“”,但返回的是“1”、“23”、“456”和“7890”。如何强制开始和结束字符串始终显示,即使它们是空的?您是否考虑过将这些空元素添加到匹配列表的开始和结束,而不依赖正则表达式?这些空元素不在你原来的问题中,非常感谢。我现在看到解决方案涉及两个独立的正则表达式:一个用于外部部分“([^0-9]*)([0-9\\.]+)([^0-9]*)”,另一个用于内部部分“([^0-9.]+\\\d+”。在“abc1.23.456.7890xyz”的示例中,外部部分给出了“abc”、“1.23.456.7890”和“xyz”。然后,内部部分可以仅应用于“1.23.456.7890”,以给出字符串“1”、“23”、“456”和“7890”。