2016-09-10 2 views
0

Я работаю над регулярными выражениями.Регулярное выражение не работает Соответствие

id: 1 food: apple, banana 
id: 2 food: orange 
ids: 3 food: apple, banana 
id: 4 food: hello, yellow 
id: 5food: apple, banana 
id:6 food: ,,,yellow 

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

pattern = /id[:] [[:digit:]]+ food[:] [a-z,]+/ 

id: 1 food: apple, banana 
id: 2 food: orange 
id: 4 food: hello, yellow 
id: 6 food:,,,yellow 

Это выражение может утратившим все, кроме последней строки. Не следует печатать последнюю строку в списке. Как можно обнаружить, что что-то не начинается с ,,,

Edit: Существует только одно пространство позволило

+0

Я запустил ваше регулярное выражение с новыми данными, и он дал ответ, который вы хотели (1, 2 и 4). – seph

ответ

1
^id:\s+[0-9]+\s+food:\s+[a-z,\s]+$ 

Это выражение я использовал, чтобы соответствовать идентификаторами 1, 2 и 4 только.

См rubular здесь

+0

Извините, в коде была опечатка. Между словами есть только одно пространство. Как я могу его изменить. – timmy24565

+0

Это будет неправильно соответствовать тексту после '' food: "', который содержит несколько запятых и/или пробелов, и текст, который начинается или заканчивается запятой или пробелом. Например, «id: 6 food: y, e, l, l, o, w» = ~/^ id: \ s + [0-9] + \ s + food: \ s + [az, \ s] + $/# => 0'. –

1
▶ input.scan /^id:\s+\d+\s+food:\s+(?:[a-z]+(?:,\s)?)+$/ 
#⇒ [ 
# [0] "id: 1 food: apple, banana", 
# [1] "id: 2 food: orange", 
# [2] "id: 4 food: hello, yellow" 
# ] 
+0

между словами есть только одно пространство. Я изменил его на это:^id: \ s + \ d + \ sfood: \ s + (?! ,,) [az, \ s] + $ и работал, но я не уверен, что если это изменится, это повлияет на что-нибудь – timmy24565

+0

Если есть допускается только одно пространство, это должно быть указано в OP явно. В этом случае вам просто не нужны lookaheads. См. Обновление. – mudasobwa

+0

Я говорил, что разрешено только одно пространство, и только одна запятая между типом пищи. Я пробовал новый код, и он все еще не работает – timmy24565

1

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

r =/
    ^     # match beginning of line 
    id:\s    # match "id:" followed by a space 
    \d+\s    # match > 0 digits followed by a space 
    food:\s    # match "food:" followed by a space 
    [[:alpha:]]+  # match > 0 letters 
    (?:,\s[[:alpha:]]+) # match comma, space, > 0 letters in a non-capture group 
    *     # perform match on above non-capture group >= 0 times 
    $     # match end of string 
    /x     # free-spacing regex definition mode 

str =<<_ 
id: 1 food: apple, banana 
id: 2 food: orange 
ids: 3 food: apple, banana 
id: 4 food: hello, yellow 
id: 5food: apple, banana 
id:6 food: ,,,yellow 
_ 

str.scan(r) 
    #=> ["id: 1 food: apple, banana", 
    # "id: 2 food: orange", 
    # "id: 4 food: hello, yellow"] 
Смежные вопросы