查找哪些短语最多只有一个大写字母

时间:2017-07-08 13:05:44

标签: php regex

我正在使用RegEx(php)找出哪些地址有一个或更少的大写字母。例如:

AV。 St Joan 128(不符合)
大道。 st joan 122(match)
AV。 St joan 212(比赛)
大道。 St.joan 121(不符合)
AV。 st joan 232(不匹配)

3 个答案:

答案 0 :(得分:3)

使用preg_grep

$strings = [
    'av. St Joan 128',
    'Av. st joan 122',
    'av. St joan 212',
    'Av. St.joan 121',
    'AV. st joan 232'
];

$results = preg_grep('~^[^A-Z]*[A-Z]?[^A-Z]*$~', $strings);

模式很简单,描述了整个字符串(使用锚点来表示字符串的开头和结尾)

故障:

^               #match start of the string
[^A-Z]*         #match zero or more (greedily) non-uppercase characters
[A-Z]?          #match zero or one uppercase character
[^A-Z]*         #match zero or more (greedily) non-uppercase characters
$               #match end of the string

意思是,字符串可能具有无限制的非大写字符,但大写字母只能出现零次或一次。如果模式找到第二个大写字符(任何地方),则立即失配/失败。

请注意,您还可以使用带有PREG_GREP_INVERT选项的@bobblebubble模式排除匹配的字符串:

$result = preg_grep('~[A-Z][^A-Z]*[A-Z]~', $strings, PREG_GREP_INVERT);

答案 1 :(得分:1)

您希望使用PHP Preg_Match_all来查找模式的所有出现。

您可以使用PCRE将模式定义为任何大写字母:

  

getRatesItemNamelist() = A-Z A(索引65)和Z(索引90)之间范围内的单个字符(区分大小写)

示例:

Array.prototype.sortOnValue = function(key){
    this.sort(function(a, b){
        if(a[key] < b[key]){
            return -1;
        }else if(a[key] > b[key]){
            return 1;
        }
        return 0;
    });
}

var arr = [{country:'France', value:'0'},{country:'Italy', value:'3'},
{country:'England', value:'1'},
{country:'Germany', value:'2'}];


arr.sortOnValue("value");

console.log(arr);
  

我正在假设您正在使用每个字符串进行搜索   基础而非每行基础,例如,您的示例文本为5   每行一行。

答案 2 :(得分:0)

  

我假设你只需要模式而不是php代码,否则请评论我删除答案。

一个简单的否定先行断言:

^(?!.*[A-Z].*[A-Z]).*$  

它不匹配任何超过一个大写字母的整行。

正如你评论的那样:
我需要一个正则表达式来找出哪个地址有一个或更少,即没有大写字母
它还匹配没有大写字母

所以它只匹配只有一个大写字母的行或匹配没有大写字母的行

输入:

av. St Joan 128 (Not maach) | more than one
Av. st joan 122 (match)     | just one
av. St joan 212 (match)     | just one
Av. St.joan 121 (Not match) | more than one
AV. st joan 232 (Not match) | more than one
av. tt joan 212 (match)     | no one

输出是:

Av. st joan 122 (match)     | just one
av. St joan 212 (match)     | just one
av. tt joan 212 (match)     | no one  

^(?!.*[A-Z].*[A-Z]).*$

注意: 要反转匹配,您只需将?!更改为?=

即可
^(?=.*[A-Z].*[A-Z]).*$  

它匹配:

av. St Joan 128 (Not maach) | more than one
Av. St.joan 121 (Not match) | more than one
AV. st joan 232 (Not match) | more than one