php regex-查找文本中带数字和空格的大写字符串 - php

我想编写php正则表达式来查找大写字符串,也可以从文本中包含一个数字和空格。

例如,从此文本"some text to contain EXAM PL E 7STRING uppercase word"我要获取字符串-EXAM PL E 7STRING

找到的字符串应仅以大写字母开头和结尾,但在中间,不带大写字母的字母也可以包含(但不一定)一个数字和空格。因此,正则表达式应匹配以下任何一种模式

1) EXAMPLESTRING               - just uppercase string
2) EXAMP4LESTRING              - with number
3) EXAMPLES TRING              - with space
4) EXAM PL E STRING            - with more than one spaces
5) EXAMP LE4STRING             - with number and space
6) EXAMP LE 4ST RI NG          - with number and spaces 

并且字符串的总长度应等于或大于4个字母

我写了这个正则表达式'/[A-Z]{1,}([A-Z\s]{2,}|\d?)[A-Z]{1,}/',它可以找到前4个模式,但是我想不出来也可以匹配后2个模式。

谢谢

参考方案

有一个名为lookahead的巧妙技巧。它只是检查当前位置之后的内容。可用于检查多个条件:

'/(?<![A-Z])(?=(?:[A-Z][\s\d]*){3}[A-Z])(?!(?:[A-Z\s]*\d){2})[A-Z][A-Z\s\d]*[A-Z]/'

第一个环顾实际上是一个向后看,并检查是否没有以前的大写字母。对于仅会导致匹配失败的字符串而言,这只是一点点加速。第二次环顾(前瞻)检查是否至少有四个字母。第三个检查没有两位数字。其余的仅匹配一个允许的字符的字符串,以大写字母开头和结尾。

请注意,如果是两位数,则根本不匹配(而不是匹配直到第二位的所有内容)。如果您确实想在这种情况下进行匹配,则可以将“ 1位数”规则合并到实际匹配中:

'/(?<![A-Z])(?=(?:[A-Z][\s\d]*){3}[A-Z])[A-Z][A-Z\s]*\d?[A-Z\s]*[A-Z]/'

编辑:

正如Ωmega所指出的那样,如果第二个数字之前少于四个字母,而第二个数字之后少于四个字母,则会造成问题。这实际上是相当困难的,因为必须断言第二个数字前必须有四个以上的字母。由于我们不知道第一位数字出现在这四个字母中的哪个位置,因此我们必须检查所有可能的位置。为此,我将完全取消前瞻性,仅提供三种不同的选择。 (我将把后面的内容作为对不匹配零件的优化。)

'/(?<![A-Z])[A-Z]\s*(?:\d\s*[A-Z]\s*[A-Z]|[A-Z]\s*\d\s*[A-Z]|[A-Z]\s*[A-Z][A-Z\s]*\d?)[A-Z\s]*[A-Z]/'

或在此处添加注释:

'/
(?<!         # negative lookbehind
    [A-Z]    # current position is not preceded by a letter
)            # end of lookbehind
[A-Z]        # match has to start with uppercase letter
\s*          # optional spaces after first letter
(?:          # subpattern for possible digit positions
    \d\s*[A-Z]\s*[A-Z]
             # digit comes after first letter, we need two more letters before last one
|            # OR
    [A-Z]\s*\d\s*[A-Z]
             # digit comes after second letter, we need one more letter before last one
|            # OR
    [A-Z]\s*[A-Z][A-Z\s]*\d?
             # digit comes after third letter, or later, or not at all
)            # end of subpattern for possible digit positions
[A-Z\s]*     # arbitrary amount of further letters and whitespace
[A-Z]        # match has to end with uppercase letter
/x'

在Ωmega的冗长测试输入上给出了相同的结果。

使用正则表达式从PHP字符串中的URL中提取整数 - php

我有一个网址,例如下面的示例http://www.website.com/page.php?pid=263547322425&foo=too 我如何使用正则表达式获取pid的值。就是说从pid =到&的值。 参考方案 $matches = array(); if (preg_match('/pid=(\d+)/', $url, $…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

从路径中提取文件名 - php

我需要从文件路径字符串获取文件名。例如,从该字符串\abc\def\filename.txt我需要获取filename.txt试图用regexp做到这一点:$filepath="abc\filename.txt"; $filename = preg_replace("/.+\\/","",$file…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…