2014-09-19 4 views
1

У меня есть строка, которая может быть разделенный запятыми список \w, таких как:Regexp захватить разделенных запятыми значений

  • абв123
  • абв123, def456, ghi789

Я пытаюсь чтобы найти регулярное выражение JavaScript, которое вернет ['abc123'] (первый случай) или ['abc123', 'def456', 'ghi789'] (без запятой).

Я пробовал:

  • ^(\w+,?)+$ - Нет, так как только последний повторяющийся рисунок будет сравниваться, 789
  • ^(?:(\w+),?)+$ - та же история. Я использую не захватывающий кронштейн. Тем не менее, захват просто не происходит для повторного слова

Является ли то, что я пытаюсь сделать даже с помощью регулярного выражения? Я пытался в значительной степени все комбинации группировки, используя перехвата и не захватив скобки, и до сих пор не удалось получить это происходит ...

+0

Что случилось с 'string.split (',')'? – elclanrs

+0

Он будет разделяться в соответствии с ',', тогда как я хочу проверить соответствие совпадений с \ w – Merc

+0

. Каков ожидаемый результат для '= badstuff, goodstuff'? Вам нужно иметь дело с механизмом эвакуации в значениях, разделенных запятой? – nhahtdh

ответ

0

Если вы хотите сбросить весь вход, когда есть что-то не так, самый простой способ проверить, а затем разделить:

if (/^\w+(,\w+)*$/.test(input)) { 
    var values = input.split(','); 

    // Process the values here 
} 

Если вы хотите, чтобы пустое значение, изменить \w+ до \w*.

Попытка согласования и проверки в одно время с одним регулярным выражением требует эмуляции функции \G, которые утверждают позицию последнего совпадения. Почему требуется \G? Так как он не позволяет двигателю повторить матч в следующей позиции и обойти проверку. Помните, чем ECMA Script регулярное выражение не имеет внешний вид-сзади, так что вы не можете различать позиции недопустимого символа и символ (ы) после него:

something,=bad,orisit,cor&rupt 
      ^^    ^^ 

Если вы не можете различать между 2 позиции, вы не можете полагаться на движок, чтобы выполнять операцию только для сравнения. Хотя можно использовать цикл while с RegExp.exec и утверждать позицию последнего матча самостоятельно, почему бы вам это сделать, когда есть более чистый вариант?


Если вы хотите Savage любой доступный, torazaburo's answer является жизнеспособным вариантом.

0

Live demo

Попробуйте это регулярное выражение:

'/([^,]+)/' 

В качестве альтернативы, строки в javascript имеют раздельный метод, который может разбивать строку на основе делиметра:

s.split(',') 
+0

Боже мой Я такой идиот. Спасибо ... – Merc

+0

Нет, это так, пожалуйста! @Merc – CMPS

+0

На самом деле, я хочу точно указать \ w. Итак, я придумал ([\ w] *,?) (Что также не заставляет меня иметь, в конце). Звучит хорошо? – Merc

-1

Может быть, вы можете использовать разделить функцию

var st = "abc123,def456,ghi789"; 
var res = st.split(','); 
0

Split на запятой, а затем отфильтровать результаты, которые не соответствуют:

str.split(',').filter(function(s) { return /^\w+$/.test(s); }) 
0

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

var val = [1234,1213.1212, 1.3, 1.4] 
var re = /[0-9]*[0-9]/gi; 
+0

На какой вопрос вы отвечаете? – Toto

0

var str = "abc123,def456, asda12, 1a2ass, yy8,ghi789"; 
 
var re = /[a-z]{3}\d{3}/g; 
 
var list = str.match(re); 
 
document.write("<BR> list.length: " + list.length); 
 
for(var i=0; i < list.length; i++) { 
 
\t document.write("<BR>list(" + i + "): " + list[i]); 
 
}

Это позволит получить только "ABC123" стиль кода в списке и ничего другого.

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