[英]php regex - find uppercase string with number and spaces in text
我想编写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个字母
我写了这个正则表达式'/[AZ]{1,}([AZ\\s]{2,}|\\d?)[AZ]{1,}/'
,可以找到前4个模式,但我无法想象它也匹配最后2个模式。
谢谢
有一个巧妙的技巧叫先行 。 它只检查当前位置后面的内容。 这可用于检查多个条件:
'/(?<![A-Z])(?=(?:[A-Z][\s\d]*){3}[A-Z])(?!(?:[A-Z\s]*\d){2})[A-Z][A-Z\s\d]*[A-Z]/'
第一个环视实际上是一个lookbehind并检查没有以前的大写字母。 对于无论如何都会使比赛失败的字符串来说,这只是一点加速。 第二个环视(前瞻)检查至少有四个字母。 第三个检查没有两个数字。 其余的只是匹配一串允许的字符,以大写字母开头和结尾。
请注意,在两位数的情况下,这根本不匹配(而不是将所有内容匹配到第二位)。 如果您确实希望在这种情况下匹配,则可以将“1位数”规则合并到实际匹配中:
'/(?<![A-Z])(?=(?:[A-Z][\s\d]*){3}[A-Z])[A-Z][A-Z\s]*\d?[A-Z\s]*[A-Z]/'
编辑:
正如Ωmega指出的那样,如果在第二个数字之前有少于四个字母,这将导致问题,但在此之后更多。 这实际上非常棘手,因为断言需要在第二个数字之前有超过4个字母。 由于我们不知道这四个字母中第一个数字的位置,我们必须检查所有可能的位置。 为此,我将完全废除前瞻,并简单地提供三种不同的替代方案。 (我将保持后视作为非匹配部件的优化。)
'/(?<![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的冗长测试输入提供了相同的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.