import Foundation
let pattern = #"\b(FLOWLINKMEDIA ID=)"#
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let testString = ##"""
<FLOWLINKMEDIA ID="LDP_COMPLETE">
<PART NAME="MAIN">
<GRPH ZORDER="0" W="4000" H="3000">
<SOURCE>back01.png</SOURCE>
</GRPH>
<GRPH ZORDER="1" TP="#00FF00">
<SOURCE LOCATION="VAR">MKTAD:MAIN_TILE</SOURCE>
</GRPH>
</PART>
<PART NAME="OMP">
<REGION NAME="REQUEST_BOTTOM">
<TEXTBOX STYLE="REQUEST_PROMPT">
<SOURCE LOCATION="VAR">LANG:INF_ONEMOMENT</SOURCE>
</TEXTBOX>
</REGION>
</PART>
</FLOWLINKMEDIA>
<FLOWLINKMEDIA ID="LDP_DEPOSITMENU">
<SM NAME="SMDL" />
<PART NAME="MAIN">
<GRPH ZORDER="0" W="4000" H="3000">
<SOURCE>back01.png</SOURCE>
</GRPH>
<REGION NAME="MARKETING_BANNER">
<GRPH ZORDER="1" TP="#00FF00">
<SOURCE LOCATION="VAR">MKTAD:OPENER_TILE</SOURCE>
</GRPH>
</REGION>
<REGION NAME="MAIN">
<TEXTBOX STYLE="LINE1_LARGEPROMPT_WIDE">
<SOURCE LOCATION="VAR">LANG:PRM_INT_LDPMENU</SOURCE>
</TEXTBOX>
<SPEECH SCR_COMP="PROMPT">
<SOURCE LOCATION="VAR">LANG:TTS_PAUSE</SOURCE>
</SPEECH>
<TEXTBOX STYLE="PROMPT_SUBTEXT">
<VARSOURCE>
<SOURCE LOCATION="VAR">LANG:INF_BCREFERENCE</SOURCE>
<VAR NAME="BCTOACCT">
<SOURCE LOCATION="VAR">BUSOBJ:USERDATA\TOACCT\NAME_NUMBER</SOURCE>
</VAR>
</VARSOURCE>
</TEXTBOX>
<SPEECH SCR_COMP="PROMPT">
<SOURCE LOCATION="VAR">LANG:TTS_PAUSE</SOURCE>
</SPEECH>
</REGION>
</PART>
<PART NAME="NAV_BAR">
<REGION NAME="NAVIGATION_BAR">
<GRPH ZORDER="1" TP="#00FF00">
<SOURCE>nav_bar.png</SOURCE>
</GRPH>
</REGION>
</PART>
<PART NAME="CANCEL">
<ACTIONKEY VALUE="CANCEL"/>
<REGION NAME="NAVIGATION_BAR_LEFT_BTN" TOUCH="Y">
<GRPH ZORDER="2" Y="80" X="90">
<SOURCE>nav_exit.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="NAVBAR_LEFT_OPTION">
<SOURCE LOCATION="VAR">LANG:FDK_CANCEL</SOURCE>
</TEXTBOX>
</REGION>
</PART>
<PART NAME="TYPE_PANEL">
<REGION NAME="MAIN_PANEL" TOUCH="N">
<GRPH ZORDER="1">
<SOURCE>main_panel.png</SOURCE>
</GRPH>
</REGION>
</PART>
<DISPLAYLIST LISTNAME="DEPTYPE" EVENTNAME="FE_SELECTED">
<POSITIONS>
<POS REGION_NAME="MAIN_PANEL_1OF3" TOUCH="Y">
<SPITEM ITEMNAME="SHOW" ENABLEINPUT="Y">
<GRPH ZORDER="3">
<SOURCE>primary_tile_1.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER">
<VARSOURCE LOCATION="VAR">
<SOURCE>LANG:INF_LDPMENU_</SOURCE>
<SOURCE LOCATION="DISPLAYLIST">VALUE</SOURCE>
</VARSOURCE>
</TEXTBOX>
</SPITEM>
<SPITEM ITEMNAME="GHOST" ENABLEINPUT="N">
<GRPH ZORDER="1" TP="#00FF00">
<SOURCE>primary_tile_1_ghost.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER_1OF2">
<VARSOURCE LOCATION="VAR">
<SOURCE>LANG:INF_LDPMENU_</SOURCE>
<SOURCE LOCATION="DISPLAYLIST">VALUE</SOURCE>
</VARSOURCE>
</TEXTBOX>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER_2OF2">
<SOURCE LOCATION="VAR">LANG:MENU_TEMP_UNAVAILABLE</SOURCE>
</TEXTBOX>
</SPITEM>
<SPITEM ITEMNAME="HIDE" ENABLEINPUT="N"/>
<RESPONSE DISPLAYTIME="100">
<GRPH ZORDER="0" TP="#00FF00">
<SOURCE>Highlight\primary_tile_1.png</SOURCE>
</GRPH>
</RESPONSE>
</POS>
<POS REGION_NAME="MAIN_PANEL_2OF3" TOUCH="Y">
<SPITEM ITEMNAME="SHOW" ENABLEINPUT="Y">
<GRPH ZORDER="3">
<SOURCE>primary_tile_1.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER">
<VARSOURCE LOCATION="VAR">
<SOURCE>LANG:INF_LDPMENU_</SOURCE>
<SOURCE LOCATION="DISPLAYLIST">VALUE</SOURCE>
</VARSOURCE>
</TEXTBOX>
</SPITEM>
<SPITEM ITEMNAME="GHOST" ENABLEINPUT="N">
<GRPH ZORDER="1" TP="#00FF00">
<SOURCE>primary_tile_1_ghost.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER_1OF2">
<VARSOURCE LOCATION="VAR">
<SOURCE>LANG:INF_LDPMENU_</SOURCE>
<SOURCE LOCATION="DISPLAYLIST">VALUE</SOURCE>
</VARSOURCE>
</TEXTBOX>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER_2OF2">
<SOURCE LOCATION="VAR">LANG:MENU_TEMP_UNAVAILABLE</SOURCE>
</TEXTBOX>
</SPITEM>
<SPITEM ITEMNAME="HIDE" ENABLEINPUT="N"/>
<RESPONSE DISPLAYTIME="100">
<GRPH ZORDER="0" TP="#00FF00">
<SOURCE>Highlight\primary_tile_1.png</SOURCE>
</GRPH>
</RESPONSE>
</POS>
<POS REGION_NAME="MAIN_PANEL_3OF3" TOUCH="Y">
<SPITEM ITEMNAME="SHOW" ENABLEINPUT="Y">
<GRPH ZORDER="3">
<SOURCE>primary_tile_1.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER">
<VARSOURCE LOCATION="VAR">
<SOURCE>LANG:INF_LDPMENU_</SOURCE>
<SOURCE LOCATION="DISPLAYLIST">VALUE</SOURCE>
</VARSOURCE>
</TEXTBOX>
</SPITEM>
<SPITEM ITEMNAME="GHOST" ENABLEINPUT="N">
<GRPH ZORDER="1" TP="#00FF00">
<SOURCE>primary_tile_1_ghost.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER_1OF2">
<VARSOURCE LOCATION="VAR">
<SOURCE>LANG:INF_LDPMENU_</SOURCE>
<SOURCE LOCATION="DISPLAYLIST">VALUE</SOURCE>
</VARSOURCE>
</TEXTBOX>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER_2OF2">
<SOURCE LOCATION="VAR">LANG:MENU_TEMP_UNAVAILABLE</SOURCE>
</TEXTBOX>
</SPITEM>
<SPITEM ITEMNAME="HIDE" ENABLEINPUT="N"/>
<RESPONSE DISPLAYTIME="100">
<GRPH ZORDER="0" TP="#00FF00">
<SOURCE>Highlight\primary_tile_1.png</SOURCE>
</GRPH>
</RESPONSE>
</POS>
</POSITIONS>
<SMDEFINED>
<SMITEM SMNAME="MORE" EVENTNAME="MORE">
<GRPH ZORDER="1" TP="#00FF00">
<SOURCE>primary_tile_1.png</SOURCE>
</GRPH>
<TEXTBOX STYLE="PRIMARY_TILE1_CENTER">
<SOURCE LOCATION="VAR">LANG:FDK_MOREACCTS</SOURCE>
</TEXTBOX>
</SMITEM>
</SMDEFINED>
</DISPLAYLIST>
</FLOWLINKMEDIA>
"""##
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