2016-09-27 4 views
0

私は正規表現のケース名をプレーンテキストで照合するRubyプログラム用の正規表現を書こうとしています。正規のケース名の正規表現

私は、次の正規表現が出ている:

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

これはほとんど私が欲しいものを行いますが、それは一致しないいくつかのエッジケースがあります。

  1. ゼーレオーストリア社&共同V東京海上ヨーロッパ保険株式会社[2009] EWHC 2066

  2. ダーリントンビル協会:私は(末尾の引用を含む)は、次の例に一致する表現を必要としますVオルークジェームズScourfield &マッカーシー[1999] PNLR 365

私は法的なケースのタイトルは、AVとのタイトルケース語の系列になることに基づいて作品を書いた表現途中で。しかし、上の例の両方の例のアンパサンドは、例1のGmbHと一緒に物事を投げ捨てており、私は部分一致(Co v ...から)を1に対してのみ得ます。私は2に全くマッチしません。

上記の両方の例に一致するように誰かに私の表現を変更する方法を教えてもらえれば、私はそれを感謝します。表現はそれほど難しいものでもあります - それは単純化することができますか?

+0

は「GmbH」は正しいですか? –

+1

それはLLCのようですが、ドイツ語です。それは[Gesellschaft mitbeschränkterHaftung]の略です(https://en.wikipedia.org/wiki/Gesellschaft_mit_beschr%C3%A4nkter_Haftung) – davidhu2000

答えて

0

ここで私は両方のケースに一致するように思いついた。

(([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)+ 

だこれは&にマッチします、と言葉AdamO'NealMcCarthyのように、それは考慮に名の異なるケースの可能性を取ります。

(v\s) 

これはスペース

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

前と同じに続く文字vと一致します。

\[\d{4}\]\s 

これは[、その後、その後、4つの数字、そして]

[A-Z]+\s\d+ 

この最後の部分はします4つの大文字、数字と一致します。私は、大文字は常に4つの文字で、数字は3〜4桁の数字であれば、あなたはこの

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

を行うことができます。この正規表現は、両方にマッチし、文字と数字が何らかの方法で制限されているかどうかわからないんだけど例:

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

しかし、それが別のものではうまくいかない場合は、私の答えに適応しようとするテキストを渡してください。

0

文字列を1つの正規表現と一致させようとはしません。以下を考慮する。

コード

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 
1
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:追加。