2016-09-10 145 views
0

我正在处理正则表达式。正则表达式不起作用correclty

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 

这种表达能够除了最后一行无效的一切。列表中的最后一行不应该打印。如何能够检测到一些不,,,

编辑开始:只有允许

+0

我跑你的正则表达式与新的数据,它给你想要的答案(1,2和4)。 – seph

回答

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

这一个空间,我用于匹配的IDS 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"]