Php 用于分析图形引用的正则表达式
我试图创建一个正则表达式来解析文本中的数字引用。我必须至少匹配以下情况: 图*1、2和3(不仅仅是3,任何数字) 图*1-3 图*1和图2 图*1 图*1至图4 因此,我尝试了以下正则表达式: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
(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+)*)