En mi caso estoy probando toda la línea.
/(?!^,)^((^|,)([abc]+|[123]+))+$/.test('a,b,c,1,2,3');
true
La anticipación negativa excluye una coma inicial.
/(?!^,)^((^|,)([abc]+|[123]+))+$/.test(',a,b,c,1,2,3');
false
Si necesita los componentes individuales, haga una simple división después de la validación.
Estoy validando las secciones y subsecciones de subdivisión 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 vez validado, me he separado usando un aspecto positivo detrás.
var secs = val.split(/(?<=S\d+)(,\s*|\s+)/i);
No creo que quiera el '!' En su mirada hacia adelante (que es para una mirada negativa), pero una mirada hacia adelante no coincide con un personaje, por lo que no coincidirá. Que debe estar bien sin lookahead '|' + – jswolf19
@ jswolf19 (:: (^,) ([a-C1-3])??): Yo uso para evitar que el carácter de liquidación en el partido. Supongo que preferencia personal. - La combinación también me da el primer partido y el resto. (sin él, obtendré solo el primer token, o el 2do en adelante) –
Sé que no quieres el ',' en el partido, pero tiene que coincidir: si tienes 'a, 1', entonces tu expresión regular no coincidirá. el buscador anticipa el ',', pero aún está allí cuando tratas de unir el 1 porque el futuro no tira el ',' lejos. Necesitas un grupo que no capture para eso '(?:)'. – jswolf19