2016-09-24 10 views
2

У меня есть эта строка:Javascript Regex разделенные запятой текст

remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820

Я хочу, чтобы соответствовать и извлекать строки разделенных запятыми.

Результат должен быть:

MATCH 1 
'remote:City|Vestavia Hills,AL' 
MATCH 2 
'remote:Citystate|Vestavia Hills' 
MATCH 3 
'395b5231539390675a7abe0751fc4820' 
MATCH 4 
'remote:City|Vestavia Hills,AL' 
MATCH 5 
'remote:Citystate|Vestavia Hills' 
MATCH 6 
'395b5231539390675a7abe0751fc4820' 

У меня есть это регулярное выражение:

(remote:[a-zA-Z]+\|[^\,]+|[a-f0-9]{32}) 

, но те города, которые имеют состояние 'AL' (разделенные запятой) разделены некорректно.

Возможное решение:

Я думал сделать что-то вроде этого - remote:[a-zA-Z]+\|.* - и конец матча на запятая, которые имеют после того, как я (remote:[a-zA-Z]+\|.*) или md5 хэш ([a-f0-9]{32},?).

Вот мой регулярное выражение тестер ссылка:

https://regex101.com/r/rP8iJ2/1

+0

Вместо регулярных выражений, попробуйте 'line.split ("")'. Поверьте мне, не стоит разбирать CSV с регулярным выражением – vlaz

+0

@vlaz это не даст результат, который я хочу.он выведет удаленный: City | Vestavia Hills и AL как два отличных результата – mwebber

ответ

1

С одной регулярного выражения можно сделать следующим образом;

var str = "remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820", 
 
    arr = str.match(/(r.+?|[\da-f]{32})(?=,?(remote|[\da-f]{32}|$))/g); 
 
console.log(arr);

+0

шедевр! точно на основе моей идеи: P – mwebber

+0

@mwebber Я рад, что я мог бы помочь :) – Redu

0

Одним из вариантов является использование сплит JavaScript:

var str = "remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820"; 
 
var aux = str.split("remote"); 
 
var res = []; 
 
for (var i=1 ; i < aux.length ; i++){ 
 
\t res.push("remote" + aux[i]); 
 
}; 
 
console.log(res);

+1

не дает результата, я хочу – mwebber

1

Вы можете точно настроить свой Regex в это регулярное выражение на основе прогноза:

/(?:^|,)(.+?(?=,(?:[a-f0-9]{32}|remote:)|$))/igm 

Это даст 6 захваченных групп, как вы ожидаете.

Updated RegEx Demo

(?:^|,)     # Match line start or comma 
(      # captured group #1 start 
    .+?     # match 1 or more of any character (lazy) 
    (?=     # lookahead start 
     ,     # match comma followed by 
     (?:    # non-capturing group start 
     [a-f0-9]{32} # match hex digit 32 times 
     |    # OR 
     remote:  # match literal "remote:" 
    )     # non-capturing group end 
     |     # OR 
     $     # line end 
    )     # looakehad end 
)      # capturing group #1 end 
+1

спасибо за объяснение :) – mwebber

+0

последний вопрос, почему он действительно производит - '[" remote: City | Vestavia Hills, AL ",", remote: Citystate | Vestavia Hills ",", 395b5231539390675a7abe0751fc4820 ",", remote: City | Vestavia Hills, AL ",", remote: Citystate | Vestavia Hills ",", 395b5231539390675a7abe0751fc4820 "]' (есть запятые, начиная с некоторые из них?) – mwebber

+0

Если вы используете 'exec' в цикле' while' и захватываете захваченную группу # 1, то у нее не будет начальной запятой. Даже демо-ссылка regex101 имеет код JS. – anubhava

1
([a-f0-9]{32}|remote:[^|]+\|[^,]+(?:,[A-Z]{2})?),? 

Это один проще понять, я сделал специальный дополнительный SUFIX к группе, чем может быть только 2 uppcase букв после запятой.

https://regex101.com/r/rP8iJ2/3

 Смежные вопросы

  • Нет связанных вопросов^_^