Nel mio caso sto testando l'intera linea.
/(?!^,)^((^|,)([abc]+|[123]+))+$/.test('a,b,c,1,2,3');
true
Il lookahead negativo esclude una virgola iniziale.
/(?!^,)^((^|,)([abc]+|[123]+))+$/.test(',a,b,c,1,2,3');
false
Se sono necessari i singoli componenti effettuare una divisione semplice dopo la convalida.
Sto convalidando sezioni e sottosezioni suddivise in PLSS.
// Check for one or more Section Specs consisting of an optional
// subsection followed by an "S" and one or two digits. Multiple
// Section Specs are separated by space or a comma and optional space.
//
// Example: SW/4 SW/4 S1, E/2 S2, N/2 N/2 S12
//
// Valid subsections are -
// (1) [NS][EW]/4\s+[NS][EW]/4 eg. NW/4 SE/4 (40 ac)
// (2) [NSEW]/2\s+[NS][EW]/4 eg. N/2 SE/4 (80 ac)
// (3) [NS]/2\s+[NS]/2 eg. N/2 S/2 (160 ac)
// (4) [EW]/2\s+[EW]/2 eg. E/2 W/2 (160 ac)
// (5) [NS][EW]/4 eg. NE/4 (160 ac)
// (6) [NSEW]/2 eg. E/2 (320 ac)
// (7) 1/1 Shorthand for the full section (640 ac)
//
// Expressions like E/2 N/2 are not valid. Use NE/4 instead.
// Expressions like NW/4 E/2 are not valid. You probably want W/2 NE/4.
var pat = '' +
'(([NS][EW]/4|[NSEW]/2)\\s+)?[NS][EW]/4\\s+' + // (1), (2) & (5)
'|([NS]/2\\s+)?[NS]/2\\s+' + // (3) & part of (6)
'|([EW]/2\\s+)?[EW]/2\\s+' + // (4) & part of (6)
'|1/1\\s+'; // (7)
pat = '(' + pat + ')?' + 'S\\d{1,2}'; // a Section Spec
// Line anchors, join alternatives and negative lookahead to exclude an initial comma
pat = '(?!^,)^((^|,\\s*|\\s+)(' + pat + '))+$';
var re = new RegExp(pat, 'i');
console.log(pat);
(?!^,)^((^|,\s*|\s+)(((([NS][EW]/4|[NSEW]/2)\s+)?[NS][EW]/4\s+|([NS]/2\s+)?[NS]/2\s+|([EW]/2\s+)?[EW]/2\s+|1/1\s+)?S\d{1,2}))+$
Una volta convalidato, ho diviso utilizzando un lookbehind positivo.
Non penso che tu voglia il '!' Nel tuo sguardo avanti (che è per uno sguardo negativo avanti), ma uno sguardo al futuro non corrisponde effettivamente a un personaggio, quindi questo non corrisponderà. Dovresti stare bene senza guardare in avanti '(?: (?:^|,) ([A-c1-3])) +' – jswolf19
@ jswolf19: Lo uso per evitare che il personaggio finisca nella partita. Immagino preferenza personale. - La combinazione mi dà anche la prima partita e il resto. (senza di esso o otterrò solo il primo token, o il 2 ° in poi) –
So che non vuoi il "," nella partita, ma deve essere abbinato: se hai 'a, 1', allora la tua regex non corrisponderà. il lookahead vede il ',', ma è ancora lì quando si tenta di abbinare il 1 perché il lookahead non getta il ',' via. Hai bisogno di un gruppo non catturante per quello '(?:)'. – jswolf19