Regex “快速拆分”;abc1.23.456.7890xyz“;变成;“abc”&引用;“1”&引用;“23”&引用;456“&引用;7890“;及;xyz";
在操作系统X上的Swift中,我试图将字符串“abc1.23.456.7890xyz”拆分为以下字符串: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”,但找到的下一个标记
"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”。