0

我试图从一个字符串中搜索三个数据,它们是:

first name, space ,last name  (?=[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND
first name ,space ,last name ,and suffix (?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND,
age   (?=[0-9]{2})

从我看到的几个教程中,这三种模式似乎是:

(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2})

一起应该是我的解决方案,但它不起作用....任何建议....(它是一个 php 脚本,我使用 preg_match_all)

我的脚本:

$content = file_get_contents('http://www.somesite.com');
$pattern = '/(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2}) /';
if(preg_match_all($pattern,$content,$matches))
{
// has the pattern, do something
//$matches has all the matches from preg_match

  }
4

4 回答 4

1

当您知道某些组件必须存在,但您不知道它们将以什么顺序出现时,这种多重前瞻技巧是最常见的。您最常在执行强密码策略的正则表达式中看到它。

您的问题要简单得多;组件总是以相同的顺序出现,但最后一个是可选的。这要容易得多:

'/\b([A-Z][a-z]*)\s+([A-Z][a-z]*)(?:\s+([0-9]{2}))?\b/'

名字在组#1 中捕获,姓氏将在组#2 中,如果有后缀,您将在组#3 中找到它。

于 2013-07-30T05:50:52.300 回答
0

您正在寻找 OR 运算符,而不是 AND:

[A-Z][a-z]+\s[A-Z][a-z]+|[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+|[0-9]{2}

如果单词之间可以有多个空格字符,请确保量化\s

[A-Z][a-z]+\s+[A-Z][a-z]+|[A-Z][a-z]+\s+[A-Z][a-z]+\s+[A-Z][a-z]+|[0-9]{2}

如果您正在寻找精确匹配,请不要忘记锚点(^和)。$

于 2013-07-30T03:54:42.503 回答
0

您可以使用非捕获组(?:...)和问号使组可选:

[A-Z][a-z]+\s[A-Z][a-z]+(?:\s[A-Z][a-z]+(?:\s[0-9]{2,3})?)?

如果要提取数据,使用命名捕获是一种干净的方法:

$pattern = <<<'LOD'
~
(?<first_name>[A-Z][a-z]+)
\s+
(?<last_name>[A-Z][a-z]+)
(?:
    \s+ (?<suffix>[A-Z][a-z]+)
    (?: \s+ (?<age> [0-9]{2,3}) )?
)?
~x
LOD;

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    echo '<br/>' . $match['first_name'] . ', ' . $match['last_name'];
} 
于 2013-07-30T03:54:52.673 回答
0
([a-zA-Z]+\s+[a-zA-Z]+\s+[a-zA-Z0-9])

您可以使用http://www.cyber-reality.com/regexy.html等工具测试您的 RegEx

于 2013-07-30T04:06:33.573 回答