Php 用于分析图形引用的正则表达式

Php 用于分析图形引用的正则表达式,php,regex,reference,Php,Regex,Reference,我试图创建一个正则表达式来解析文本中的数字引用。我必须至少匹配以下情况: 图*1、2和3(不仅仅是3,任何数字) 图*1-3 图*1和图2 图*1 图*1至图4 因此,我尝试了以下正则表达式: (Fig[a-zA-Z.]*)(\s(\d(,|\s)* )+|\d\s|and\s\d|\s\d-\d|\s\d)* 最好的结果是将数字分开,但是有了匹配,我就可以清理结果并解析数字。 但我似乎无法解析“1到4”。而且,这个正则表达式似乎根本没有被优化。有什么想法吗 下面是一个示例:试试这个: (Fi

我试图创建一个正则表达式来解析文本中的数字引用。我必须至少匹配以下情况: 图*1、2和3(不仅仅是3,任何数字)

图*1-3

图*1和图2

图*1

图*1至图4

因此,我尝试了以下正则表达式:

(Fig[a-zA-Z.]*)(\s(\d(,|\s)* )+|\d\s|and\s\d|\s\d-\d|\s\d)*
最好的结果是将数字分开,但是有了匹配,我就可以清理结果并解析数字。 但我似乎无法解析“1到4”。而且,这个正则表达式似乎根本没有被优化。有什么想法吗

下面是一个示例:

试试这个:

(Fig.*) ((\d( to | and |-)\d)|\d)|(\d,\d and \d)
编辑:
我看到我以前的正则表达式不起作用

为了赎回,我提供了两种可行的选择:

1. 使用多行模式-这使用\G锚点,它提供了一种方法
获得适合阵列的对齐和修剪输出

 #  '/(^Fig[a-zA-Z.]*\h+|(?!^)\G)(?(?<=\d)\h*,\h*)(\d+)(?|\h*(-)\h*(\d+)|\h+(and)\h+(\d+)|\h+(to)\h+(\d+))?/'

 (                           # (1 start)
      ^ Fig [a-zA-Z.]* \h+        #  Fig's
   |                            # or,
      (?! ^ )                     # Start at the end of last match
      \G 
 )                           # (1 end)

 (?(?<= \d )                 # Conditional, if previous digit
      \h* , \h*                   # Require a comma
 )                           # End conditional

 ( \d+ )                     # (2), Digit
 (?|                         # Branch reset (optionally, one of the (-|and|to) \d forms)
      \h* 
      ( - )                       # (3), '-'
      \h* 
      ( \d+ )                     # (4), Digit
   |  \h+ 
      ( and )                     # (3), 'and'
      \h+ 
      ( \d+ )                     # (4), Digit
   |  \h+ 
      ( to )                      # (3), 'to'
      \h+ 
      ( \d+ )                     # (4), Digit
 )?
2.使用多行模式-这与整个行匹配,其中捕获组1包含“图”
第2组包含所有的数字形式

 #  '/^(Fig[a-zA-Z.]*\h+)((?(?<=\d)\h*,\h*|\d+(?:\h*-\h*\d+|\h+and\h+\d+|\h+to\h+\d+)?)+)\h*$/'

 ^ 
 ( Fig [a-zA-Z.]* \h+ )      # (1), Fig's
 (                           # (2 start), All the num's
      (?(?<= \d )                 # Conditional, if previous digit
           \h* , \h*                   # Require a comma 
        |                            # or
           \d+                         # Require a digit
           (?:                         # (and optionally, one of the \d (-|and|to) \d forms)
                \h* - \h* \d+ 
             |  \h+ and \h+ \d+ 
             |  \h+ to \h+ \d+ 
           )?
      )+                          # End conditional, do many times
 )                           # (2 end)
 \h* 
 $

(?(?您可以使用以下模式:

(Fig(?:ures?|s\.)) (\d+(?:(?:-|, | (?:and|to) )\d+)*)

如果您需要更大的灵活性,可以用
\h+
\h*

替换空格,Casimirs的答案是最好的选择,因为它将数字分隔开,但是Alberto的答案也很好。Sin的答案在PHP上不起作用。
 #  '/^(Fig[a-zA-Z.]*\h+)((?(?<=\d)\h*,\h*|\d+(?:\h*-\h*\d+|\h+and\h+\d+|\h+to\h+\d+)?)+)\h*$/'

 ^ 
 ( Fig [a-zA-Z.]* \h+ )      # (1), Fig's
 (                           # (2 start), All the num's
      (?(?<= \d )                 # Conditional, if previous digit
           \h* , \h*                   # Require a comma 
        |                            # or
           \d+                         # Require a digit
           (?:                         # (and optionally, one of the \d (-|and|to) \d forms)
                \h* - \h* \d+ 
             |  \h+ and \h+ \d+ 
             |  \h+ to \h+ \d+ 
           )?
      )+                          # End conditional, do many times
 )                           # (2 end)
 \h* 
 $
(Fig(?:ures?|s\.)) (\d+(?:(?:-|, | (?:and|to) )\d+)*)