[C#/Regex] Aantal gematchte groups reduceren?

Pagina: 1
Acties:

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
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:
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...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Een regular expression retourneert AFAIK altijd als eerste waarde de hele gematchte string. Volgens mij kun je daar dus ook niet zoveel tegen beginnen.

Waarom ook, je kan toch gewoon de tweede waarde inlezen?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 10:48

Eelke Spaak

- Vlad -

-NMe- schreef op maandag 26 september 2005 @ 20:07:
Een regular expression retourneert AFAIK altijd als eerste waarde de hele gematchte string. Volgens mij kun je daar dus ook niet zoveel tegen beginnen.
Dit is inderdaad zo.

TheStreme - Share anything with anyone


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
-NMe- schreef op maandag 26 september 2005 @ 20:07:
Een regular expression retourneert AFAIK altijd als eerste waarde de hele gematchte string. Volgens mij kun je daar dus ook niet zoveel tegen beginnen.

Waarom ook, je kan toch gewoon de tweede waarde inlezen?
Eh, ok :)

Ik had geen aanwijzingen dat dit niet zou kunnen, en ik bedacht me dat mijn regex-skills eigenlijk zo slecht zijn, dat er vast wel een manier zou moeten zijn om dit wel te bewerkstelligen. Dat zou tevens een learning experience geweest zijn voor mij.

Maar goed, als dit een gegeven is waar niet omheen te werken valt, dan moet ik inderdaad maar gewoon met de 2e group werken. Dat het niet mogelijk is, is ook een hele geruststelling :)