Между другото, регулярните изрази поддържат интерполация:
name = /[^@]+/
host = /\w+\.(com|net|org)/
email = /#{name}@#{host}/ # => /(?-mix:[^@]+)@(?-mix:\w+\.(com|net|org))/
Regexp#match
$~
Regexp.last_match
Enumerable
MatchData#[група]
, където група
е номер или име на група, ви връща порцията текст, отговаряща на съответната група
MatchData#begin(група)
пък ви връща число — отместването спрямо началото на низа на порцията текст, отговаряща на съответната група
/(\w+)/.match('Some words')[1] # => "Some"
/(\w+)/.match('Some words').begin(1) # => 0
/(?<id>\d+)/.match('ID: 12345')[:id] # => "12345"
/(?<id>\d+)/.match('ID: 12345').begin(:id) # => 4
MatchData#pre_match
(същото като специалната променлива $`
) — текстът преди съвпадението
MatchData#post_match
(същото като специалната променлива $'
) — текстът след съвпадението
match = /(?<number>\d+)/.match 'ID: 12345 (new)'
match[:number] # => "12345"
match.pre_match # => "ID: "
match.post_match # => " (new)"
$~
, $'
, $1
, $2
, $3
и прочее
match
Regexp#match
html = '<h1>Header</h1>' # или:
html = '<img src="http://my/image.src" alt="Kartman Makes Burgers" />'
case html
when /(<h(\d)>)(.+)<\/h\2>/
{header: $3, size: $2}
when /<a\s+href="([^"]+)">([^<]+)<\/a>/
{url: $1, text: $2}
when /<img\s+src="([^"]+)"\s+alt="([^"]+)"\s*\/>/
{image: $1, alt: $2}
else
'unrecognized tag'
end
# {:image=>"http://my/image.src", :alt=>"Kartman Makes Burgers"}
String#match
String#=~
и String#!~
String#sub
, String#gsub
и вариантите им с !
String#[]
и String#slice
- в някои от вариантите си приемат регулярен израз
String#index
и rindex
приемат и регулярен израз
String#partition
и rpartition
и други...'SomeTitleCase'.gsub /(^|[[:lower:]])([[:upper:]])/ do
[$1, $2.downcase].reject(&:empty?).join('_')
end
# "some_title_case"
Цитат от документацията:
A regexp can be matched against a string when they either share an encoding, or the regexp’s encoding is US-ASCII and the string’s encoding is ASCII-compatible.
Regexp#encoding
/something/u
за UTF-8
Rubyのお父さんはまつもとゆきひろさんです。
unicode_test = 'Rubyのお父さんはまつもとゆきひろさんです。'
/は[[:alpha:]]+さん/.match unicode_test # #<MatchData "はまつもとゆきひろさん">
\b
в Unicode-текст работи, когато границата на думата е лесно определима
/\b[[:alpha:]]\b/.match 'това и онова' # #<MatchData "и">
Rubyのお父さんはまつもとゆきひろさんです。
?Например:
'Ruby no otousan ha Matsumoto Yukihiro san desu.'.gsub(/(\b[[:alpha:]]+\b)/) { "[#{$1}]" }
# "[Ruby] [no] [otousan] [ha] [Matsumoto] [Yukihiro] [san] [desu]."
Но:
'Rubyのお父さんはまつもとゆきひろさんです。'.gsub(/(\b[[:alpha:]]+\b)/) { "[#{$1}]" }
# "[Rubyのお父さんはまつもとゆきひろさんです]。"
/pattern/flags
i
прави търсенето на съвпадение нечувствително към регистъра на буквите
u
кара шаблона да носи задължителна кодировка UTF-8
m
превръща шаблона в multiline-такъв (в този режим, например, .
ще съвпада и с нов ред)
(?(cond)yes|no)
cond
може да е референция към друга група в шаблона, или пък look-ahead/behind
regexp = /^(number)?\s*(?(1)\d+|[a-zA-Z]+)$/
regexp =~ "number 123" # => 0
regexp =~ "foo" # => 0
regexp =~ "number baz" # => nil
Regexp
: http://www.ruby-doc.org/core-2.3.3/Regexp.html
MatchData
: http://www.ruby-doc.org/core-2.3.3/MatchData.html
String
: http://www.ruby-doc.org/core-2.3.3/String.html
ri
, например: ri Regexp#=~
Да се напише кратък Ruby expression, който проверява дали дадено число е просто или не, посредством употреба на регулярен израз. Резултатът от изпълнението му трябва да еtrue
за прости числа иfalse
за всички останали. Неща, които можете да ползвате:
- Самото число, разбира се.
- Произволни методи от класа
Regexp
- Подходящ регулярен израз (шаблон)
- Текстовия низ
'1'
.String#*
.- Някакъв условен оператор (например
if
-else
или? … : …
)true
,false
, ...
'1' * числото =~ /някакъв регулярен израз/ ? false : true
'1' * 13 =~ /^1?$|^(11+?)\1+$/ ? false : true
Like any...
git init
Създава празно хранилище в текущата директория.
Виждате папката .git
- съхранява всичко, което е нужно за историята.
git clone https://github.com/fmi/ruby-lectures.git
file
, ssh
и git
.git
.git
.git/index
git
директория
git pull
и git push
Untracked
- няма версии на този файл в staging областта и локалното хранилище (нов файл)
Unmodified
- файлът е с еднакво съдържание в работната директория, staging и хранилището
Modified
- файлът е с различно съдържание в работната директория и staging
Staged
- файлът е с еднакво съдържание в работната директория и staging, но се различава в хранилището
git add new_or_modified.rb
git add lectures/11
git add .
git status
git diff
--staged
(--cached
в по-стари версии) - промени на файлове в staging.git rm old.rb
git reset new_or_modified.rb
git reset lectures/11
blob
) - конкретна негова версия (snapshot), компресиран
tree
) - списък от хешове на файлове и дървета
Commit
- за него след малко
Tag
- етикет, съдържащ идентификатора на конкретен commit
.git/objects
sha1
хеш от съдържанието сиЕдна конкретна версия на кода.
Състои се от:
git log
git log --stat
git log --since=2.weeks
git log --since=5.days.15.minutes
git log --until=2013-11-30
git log --grep 'Proc.new'
git log --author 'Dimitar Dimitrov'
git log lectures/01-introduction-to-ruby.slim
git show 5fae69568cd5420e13a34c06f6f495ea9bcb9a4e
git show 5fae695
git show HEAD
git show HEAD^
git show HEAD^^^
git show HEAD~3
git diff HEAD~3..HEAD
HEAD
е указател към последния commit
HEAD^^^
- Броят стрелкички е поредният номер на commit-a (0 е най-скорошният)
HEAD~n
- същото като HEAD^
с n
на брой стрелкичкиgit cat-file -p 5fae695
5fae695
е част от хеша на commit-agit commit
git commit -m "Fix a typo on slide 3"
Commit-вайте възможно най-малките, логически свързани промени, които не чупят нищо.