2010-12-08 4 views
0

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

Мое плохое регулярное выражение:

(\d*),?(\d*\.?\d*)-?(\d*\.?\d*),?([0-1]?),?([0-1]?),?([^\/]*) 

совпадениями, OK:

1,2-3,1,1,asdf 
1,2-3,1,1 
1,2-3,1 
1,2-3 
1,2 
1 

Но, к сожалению, это также будет соответствовать, и я не хочу, чтобы это было:

asdf 
1,asdf 

В идеале, мне хотелось бы что-то вроде - match, если предыдущие группы были сопоставлены.

Я знаю, что, возможно, положительный внешний вид должен использоваться, но если я не ошибаюсь, его следует использовать прямо перед каждой группой, за исключением 1-го, и регулярное выражение будет большим и вонючим после этого. Um, и это, вероятно, будет переменной длиной.

Есть ли элегантный способ сделать это?

EDIT

Я хочу, чтобы соответствовать все строки, приведенные ниже спичек, которые OK.

Я хотел был бы сопоставить \d* с первой группой. Затем, если был матч с \d*, а затем ,, я хотел бы совместить (\d*\.?\d*) со второй группой. После этого, если в первой группе было совпадение, а затем , и совпадение во второй группе, а затем - Я хотел бы сопоставить другой (\d*\.?\d*) ... и т. Д. До конца Regex.

+5

Не могли бы вы объяснить **, что ** вы хотите, чтобы он соответствовал, а не то, что у вас нет? – detunized 2010-12-08 07:51:18

+0

да, чего вы пытаетесь достичь? Это поможет .. – 2010-12-08 07:55:55

ответ

1

Вы не очень ясно, в вашем вопросе, но из примеров, которые я думаю, что это то, что вам нужно:

^\d(,\d-\d(,\d(,\d(,[a-z]+)?)?)?)?$ 

alt text

Это соответствует:

1,2-3,1,1,asdf 
1,2-3,1,1 
1,2-3,1 
1,2-3 
1,2 
1 

Test link.