我试图从字符串中搜索三个数据,它们是:
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
}
答案 0 :(得分:1)
当您知道必须存在某些组件时,多次前瞻性技巧有时会出现,但您不知道它们将出现在哪个顺序中。您最常见的是强制执行强密码策略的正则表达式。
你的问题要简单得多;组件总是以相同的顺序排列,但最后一个是可选的。这更容易:
'/\b([A-Z][a-z]*)\s+([A-Z][a-z]*)(?:\s+([0-9]{2}))?\b/'
第一个名字在第1组中被捕获,最后一个名字将在第2组中被捕获,如果有后缀,你将在第3组中找到它。
答案 1 :(得分: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}
如果您正在寻找完全匹配,请不要忘记主播(^
和$
)。
答案 2 :(得分: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'];
}
答案 3 :(得分:0)
([a-zA-Z]+\s+[a-zA-Z]+\s+[a-zA-Z0-9])
等工具测试您的RegEx