我不会尝试将字符串与单个正则表达式匹配。请考虑以下事项。
代码
R1 = /
\s+v\s+ # match 'v' preceded by >= 1 spaces and followed by >= 1 spaces
| # or
\s+\[ # match a left bracket preceded by >=1 spaces
| # or
\]\s+ # match a right bracket followed by >=1 spaces
/x # free-spacing regex definition mode
def legal_case_name?(str)
party1, party2, year, id = str.split R1
valid_party?(party1) && valid_party?(party2) && valid_year?(year) && valid_id?(id)
end
def valid_party?(party)
return false if party.nil?
party.split.all? { |word| word == '&' || word =~ /\A[[:alpha:]]+\z/ }
end
def valid_year?(year)
return false unless year =~ /\A\d{4}\z/
(1950..2040).cover? year.to_i
end
R2 = /
EWHC\s+\d{4} # match 'EWHC' followed by >= 1 spaces and then 4 digits
| # or
PNLR\s+\d{3} # match 'PNLR' followed by >= 1 spaces and then 3 digits
| # or
ABC\s+\d{5} # match 'ABC' followed by >= 1 spaces and then 5 digits
/x # free-spacing regex definition mode
def valid_id?(id)
(id =~ R2) ? true : false
end
其中一些方法可能需要修改以反映需求。
示例
legal_case_name? "Seele GmbH & Co v Tokyo Insurance Ltd [2009] EWHC 2066"
#=> true
legal_case_name? "Darlington Soc v Scourfield & McCarthy [1999] PNLR 365"
#=> true
legal_case_name? "Darlington Soc vs Scourfield & McCarthy [1999] PNLR 365"
#=> false
legal_case_name? "Darlington Soc v Scourfield & McCarthy [1921] PNLR 365"
#=> false
legal_case_name? "Darlington Soc v Scourfield & McCarthy [1921] PNLR 3652"
#=> false
说明
假设
str = "Seele GmbH & Co v Tokyo Insurance Ltd [2009] EWHC 2066"
然后
party1, party2, year, id = str.split R1
#=> ["Seele GmbH & Co", "Tokyo Insurance Ltd", "2009", "EWHC 2066"]
party1
#=> "Seele GmbH & Co"
party2
#=> "Tokyo Insurance Ltd"
year
#=> "2009"
id
#=> "EWHC 2066"
valid_party?(party1)
#=> true
valid_party?(party2)
#=> true
valid_year?(year)
#=> true
valid_id?(id)
#=> true