2015-10-30 29 views
4

考慮下面的Ruby代碼:爲什麼自由間距模式停止工作時產生負向後視?

/(?<!big)dog/.match('I have a big dog.')  # => nil 

現在,我要啓用自由間隔模式:

/(?x)(?<!big)dog/.match('I have a big dog.')  # => #<MatchData "dog"> 

爲什麼會發生這種情況,我怎麼能實現無間隔模式,而不打破我的負面lookbehinds?

回答

3
/(?x)(?<!big)dog/.match('I have a big dog.') 
#   ^

請注意,您在big之後有一個空格。由於它是擴展模式,空白被忽略。

你有some options

  • 用作\s\p{Space}這樣的模式。
  • 使用轉義空格,如\,即以 反斜槓開頭的空格。
  • 使用字符類,如[ ]

例如:

/(?x)(?<!big\s)dog/.match('I have a big dog.') 
# => nil 
+1

在特定的子表達式禁用它也可能是一個選項:'/(X?)( - X:?!(<大))狗/' – cremno

+0

更多選項來匹配空間:'\ x20'(十六進制)和'\ 040'(八進制) – Mariano

相關問題