Trong trường hợp của tôi, tôi đang thử nghiệm toàn bộ dòng.
/(?!^,)^((^|,)([abc]+|[123]+))+$/.test('a,b,c,1,2,3');
true
Dấu chú âm phủ định không bao gồm dấu phẩy ban đầu.
/(?!^,)^((^|,)([abc]+|[123]+))+$/.test(',a,b,c,1,2,3');
false
Nếu bạn cần các thành phần riêng lẻ thực hiện phân tách đơn giản sau khi xác thực.
Tôi đang xác thực các phần và phần phụ thuộc 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}))+$
Sau khi xác thực tôi chia sẻ bằng cách sử dụng một cái nhìn tích cực.
var secs = val.split(/(?<=S\d+)(,\s*|\s+)/i);
Tôi không nghĩ bạn muốn '!' Nhìn về phía trước (cái nhìn tiêu cực), nhưng nhìn về phía trước không thực sự khớp với ký tự, vì vậy điều này sẽ không khớp. Bạn nên ổn mà không có lookahead '(?: (?:^|,) ([A-c1-3])) +' – jswolf19
@ jswolf19: Tôi sử dụng nó để tránh nhân vật cuộn tròn trong trận đấu. Tôi đoán sở thích cá nhân. - sự kết hợp cũng mang lại cho tôi cả trận đấu đầu tiên và phần còn lại. (nếu không có nó, tôi sẽ chỉ nhận được mã thông báo đầu tiên hoặc số 2 trở đi) –
Tôi biết bạn không muốn ',' trong trận đấu, nhưng nó phải khớp với nhau: nếu bạn có 'a, 1', sau đó regex của bạn sẽ không phù hợp với nó. lookahead nhìn thấy ',', nhưng nó vẫn còn đó khi bạn cố gắng để phù hợp với 1 bởi vì lookahead không ném ',' đi. Bạn cần một nhóm không bắt giữ cho '(?:)' Đó. – jswolf19