【问题标题】:Regular expression for legal case names法律案例名称的正则表达式
【发布时间】:2017-02-05 17:22:26
【问题描述】:

我正在尝试编写一个用于 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. Darlington Building Society v O'Rourke James Scourfield & McCarthy [1999] PNLR 365

我写的表达是基于法律案例标题将是一系列标题案例词,中间有一个v。但是,上述两个示例中的 & 符号以及示例 1 中的 GmbH 都在扔东西,我只得到了与 1 的部分匹配(来自 Co v ...)。我根本没有得到 2 的匹配。

如果有人能告诉我如何更改我的表达方式以匹配上述两个示例,我将不胜感激。这个表达式也很笨拙——也许可以简化一下?

【问题讨论】:

标签: ruby regex text pattern-matching


【解决方案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 非常强大,即使您需要更复杂的东西,它也能让您编写非常清晰的正则表达式。

编辑:忘记了年份以及最后的其他事情。一会儿会修复。

EDIT2:添加。

【讨论】:

    【解决方案2】:

    这是我想出的匹配这两种情况的方法。

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

    这将匹配&amp;,以及像AdamO'NealMcCarthy 这样的词,它考虑了名称的不同大小写可能性。

    (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}
    

    【讨论】:

      【解决方案3】:

      此正则表达式与两个示例匹配:

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

      但如果它不适用于另一个,只需将文本传递给我,我将尝试调整我的答案。

      【讨论】:

        【解决方案4】:

        我不会尝试将字符串与单个正则表达式匹配。请考虑以下事项。

        代码

        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 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          • 2011-05-11
          • 2019-08-09
          • 2023-04-09
          • 1970-01-01
          相关资源
          最近更新 更多