Регулярное выражение для названий юридических дел

0 user1022788 [2016-09-28 01:45:00]

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

Я придумал следующее регулярное выражение:

((([[:upper:]])+\s)?((([[:upper:]]+([[:lower:]])+)\s)+v\s((\b[[:upper:]]([[:lower:]])+)\s?)+(\(|\[)+\d+(\)|\])\s(\d+\s)?\w+\s(\w+)?(\s)?(\d+)?))

Это почти делает то, что я хочу, но есть некоторые крайние случаи, когда он не подходит. Мне нужно выражение, которое будет соответствовать следующим случаям (включая цитату в конце):

  1. Seele Austria GmbH & Co v Tokyo Marine Europe Insurance Ltd [2009] EWHC 2066

  2. Дарлингтонское строительное общество v O'Rourke James Scourfield & McCarthy [1999] PNLR 365

Выражение, которое я написал, основывается на том, что названия судебных дел будут представлять собой серию слов с ключевыми словами с av посередине. Однако амперсанды в обоих приведенных выше примерах вместе с GmbH в примере 1 отбрасывают вещи, и я получаю только частичное совпадение (от Co v...) против 1. Я не получаю никакого совпадения вообще для 2.

Если кто-нибудь покажет мне, как изменить свое выражение, чтобы соответствовать обоим вышеприведенным примерам, я был бы признателен. Выражение также довольно громоздко, поскольку оно может быть упрощено?

ruby regex text pattern-matching


4 ответа


1 Amadan [2016-09-28 05:44:00]

CASE_REGEXP = %r{
  (?<spaces>    \s+ ){0}
  (?<capword>   [[:upper:]] [[:alpha:]']+ ){0}
  (?<titleword> \g<capword> | & ){0}
  (?<title>     \g<capword> (?:\g<spaces> \g<titleword>)* ){0}
  (?<year>      \[ \d{4} \] | \( \d{4} \) ){0}
  (?<endbit>    [[:upper:]]+ \g<spaces> \d+ ){0}

  \g<title> \g<spaces> v \g<spaces> \g<title>
  \g<spaces> \g<year>
  \g<spaces> \g<endbit>
}x

Ruby Oniguruma очень мощный и дает вам возможность писать очень четкие регулярные выражения, даже если вам нужно что-то более сложное.

EDIT: забыл о году и все остальное в конце. Немного поправим.

EDIT2: добавлено.


0 davidhu2000 [2016-09-28 02:19:00]

Вот то, что я придумал, чтобы соответствовать обоим случаям.

(([A-Z]('[A-Z]|[a-z][A-Z])?[a-z]+[A-Z]?|&)\s)+(v\s)(([A-Z]('[A-Z]|[a-z][A-Z])?[a-z]+[A-Z]?|&)\s)+\[\d{4}\]\s[A-Z]+\s\d+

Здесь разбивка

(([A-Z]('[A-Z]|[a-z][A-Z])?[a-z]+[A-Z]?|&)\s)+

Это будет соответствовать &, и такие слова, как Adam, O'Neal, McCarthy, он учитывает различные возможности случая для имен.

(v\s)

Это будет соответствовать букве v за которой следует пробел

(([A-Z]('[A-Z]|[a-z][A-Z])?[a-z]+[A-Z]?|&)\s)+

То же, что и раньше.

\[\d{4}\]\s

Это будет соответствовать [, затем 4 номера, затем ]

[A-Z]+\s\d+

Эта последняя часть будет содержать 4 заглавных буквы, а затем цифры. Я не уверен, что буквы и числа ограничены в некотором роде, если заглавные буквы всегда 4 буквы, а цифры от 3 до 4 цифр, вы можете сделать это

[A-Z]{4}\s\d{3,4}

0 Cary Swoveland [2016-09-28 04:20:00]

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

Код

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 

0 Marcel Jacques Machado [2016-09-28 02:34:00]

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

([A-Z][A-Za-z\s]+|\s&\s).*(\sv\s)[^\[]*\[[0-9]{4}\]\s[A-Z]+\s[0-9]+

Но если это не работает для другого, просто передайте мне текст, который я попытаюсь приспособить к моему ответу.