import Foundation
let pattern = #"\[\[hero:([^:\]]*):?.*\]\]"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
<div id="HeroesChanges">
[[hero:abaddon]]
[[patchnote]] Aphotic Shield cast point reduced from 0.4 to 0.3
[[patchnote]] Borrowed Time scepter duration increased from 5/6/7 to 6/7/8
[[patchnote]] Level 15 Talent increased from +48 Mist Coil Heal/Damage to +50
[[patchnote]] Level 15 Talent changed from +6 Armor to +65 Damage
[[patchnote]] Level 20 Talent changed from +80 Damage to +8 Armor
[[patchnote]] Level 25 Talent increased from 375 AoE Mist Coil to 425
[[shard:abaddon_aphotic_shield:shardupgrade]]
[[shardnote]] Causes Mist Coil and Aphotic Shield to apply a Curse of Avernus stack on enemies. Increases base slow by 6%.
[[shardvideo]]
[[heroend]]
[[hero:alchemist]]
[[patchnote]] Unstable Concoction manacost reduced from 120 to 90/100/110/120
[[patchnote]] Unstable Concoction cooldown reduced from 22/20/18/16 to 16
[[patchnote]] Acid Spray damage increased from 15/20/25/30 to 20/25/30/35
[[patchnote]] Acid Spray first damage instance is now immediate rather than after a second
[[patchnote]] Gold bonus cap reduced from 18/22/26/30 to 18/21/24/27 (last hit count from 5/7/8/9 to 5/6/7/8)
[[patchnote]] If an ally already has a scepter buff or the item, it refunds them based on which version they have (either 4200 or 5800).
[[patchnote]] Alchemist granted scepter buffs provide the full stat bonuses.
[[patchnote]] Scepter damage/spell amp bonus reduced from 30/6 to 20/5
[[patchnote]] Level 20 Talent reduced from +30% Cleave to +25%
[[shard:alchemist_berserk_potion:shardnew]]
[[shardnote]] Grants Berserk Potion. Throws a potion at the target ally, applying a basic dispel and granting +50 Attack Speed and +40 HP Regen for 10 seconds. Cast Range: 800. Cooldown: 45. Manacost: 125. Can be used on self.
[[shardvideo]]
[[heroend]]
[[hero:ancient_apparition]]
[[patchnote]] Ice Blast max travel time improved from 2 seconds to 1.75
[[patchnote]] Chilling Touch manacost reduced from 30/50/70/90 to 30/45/60/75
[[shard:ancient_apparition_ice_vortex:shardupgrade]]
[[shardnote]] Causes Ice Vortex to deal 40 DPS and reduces attack speed by 20.
[[shardvideo]]
[[heroend]]
[[hero:antimage:scepterreworked]]
[[patchnote]] Mana Break max burn reduced from 1/2/3/4% to 1/1.8/2.6/3.4%
[[patchnote]] Level 15 Talent changed from +12 Agility to +8 Armor
[[patchnote]] Level 15 Talent reduced from +325 Blink Cast Range to +300
[[patchnote]] Level 20 Talent changed from Blink Uncontrollable Illusion to +0.1 Mana Void Damage Multiplier
[[patchnote]] <span class="reworked-scepter">Scepter Rework:</span> Now grants Blink Fragment. Blinks an illusion at the target enemy or location and attacks them for 7 seconds. Uses Blink's Cast Range. Illusion cannot be controlled, deals 50% damage, takes 250%. Casting Counterspell also casts it on the Fragment illusion. Cooldown: 20. Manacost: 50
[[shard:antimage_counterspell:shardupgrade]]
[[shardnote]] Successful Counterspell creates an illusion attacking the caster for 5 seconds. Removes Counterspell manacost.
[[shardvideo]]
[[heroend]]
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression