Ik wil met regular expressions een SQL 'CREATE TABLE' instructie parsen om daaruit de naam van de kolommen te halen die de primary key vormen. Dus stel dat mijn 'CREATE TABLE' er zo uitziet:
Dan wil ik een group terughebben met daarin 2 matches, nl. "mcoMediumID" en "mcoContentID". Nu is dit me al grotendeels gelukt, door een Regex te maken met de volgende expressie:
Het probleem is echter dat deze expressie teveel doet, want ik krijg binnen 1 match nl. 2 groups terug. De 2e levert precies het gevraagde antwoord (twee captures met resp. "mcoMediumID" en "mcoContentID"), maar de 1e group bestaat uit 1 capture met als inhoud " PRIMARY KEY (`mcoMediumID`,`mcoContentID`),".
Hoe voorkom ik dat die 1e group gerapporteerd wordt? Ik heb al lopen prutsen met "(?: ... )" om verschillende delen van de regex, maar niets lijkt te voorkomen dat de hele PRIMARY KEY regel wordt geretourneerd...
SQL:
1
2
3
4
5
6
7
8
9
10
11
| CREATE TABLE `tblmediacontents` ( `mcoMediumID` int(10) unsigned NOT NULL default '0', `mcoContentID` int(10) unsigned NOT NULL default '0', `mcoGroupNr` int(10) unsigned default NULL, `mcoLastModified` datetime NOT NULL default '0000-00-00 00:00:00', `mcoIsDeleted` enum('False','True') NOT NULL default 'False', PRIMARY KEY (`mcoMediumID`,`mcoContentID`), KEY `tblMediaContents_IN2` (`mcoContentID`), CONSTRAINT `tblMediaContents_FK1` FOREIGN KEY (`mcoMediumID`) REFERENCES `tblmedium` (`medID`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `tblMediaContents_FK2` FOREIGN KEY (`mcoContentID`) REFERENCES `tblcontent` (`conID`) ON DELETE CASCADE ONUPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; |
Dan wil ik een group terughebben met daarin 2 matches, nl. "mcoMediumID" en "mcoContentID". Nu is dit me al grotendeels gelukt, door een Regex te maken met de volgende expressie:
C#:
1
| Regex r = new Regex(@"\s*PRIMARY KEY\s*\((?:(?:`(.+?)`)+,?)+?\)[,\n]"); |
Het probleem is echter dat deze expressie teveel doet, want ik krijg binnen 1 match nl. 2 groups terug. De 2e levert precies het gevraagde antwoord (twee captures met resp. "mcoMediumID" en "mcoContentID"), maar de 1e group bestaat uit 1 capture met als inhoud " PRIMARY KEY (`mcoMediumID`,`mcoContentID`),".
Hoe voorkom ik dat die 1e group gerapporteerd wordt? Ik heb al lopen prutsen met "(?: ... )" om verschillende delen van de regex, maar niets lijkt te voorkomen dat de hele PRIMARY KEY regel wordt geretourneerd...