我正在尝试匹配字符串模式,而我的正则表达式是
/^[a-zA-Z0-9]*(-|\s)*Iphone 7(\s|-)?(\p{N}GB)?\B/i
我想要匹配的字符串是Apple Iphone 7 Plus 16 Gb
。我想匹配完全正则表达式,即Iphone 7应该只与下面的
请让我知道我做错了什么? 这是正则表达式link
答案 0 :(得分:1)
不确定是否理解您的需求,但如何:
/^.*?iphone 7(?:\s+(?:plus\s+)?\d+\s?gb.*)?$/i
<强>解释强>
/ : regex delimiter
^ : begining of string
.*? : 0 or more any characters not greedy
iphone 7 : literally
(?: : start non capture group
\s+ : 1 or more spaces
(?: : start non capture group
plus : literally
\s+ : 1 or more spaces
)? : end group^, optional
\d+ : 1 or more digits
\s? : 1 optional space
gb : literally
.* : 0 or more any character
)? : end group, optional
$ : end of string
/i : regex delimiter, case insensitive
在行动中:
$tests = array(
'any digits or string apple iphone 7',
'any digits or string apple iphone 7 16 gb',
'any digits or string apple iphone 7 32GB - Silver',
'any digits or string apple iphone 7 plus',
'any digits or string apple iphone 7s',
);
foreach ($tests as $test) {
echo "$test\t ==> ";
if (preg_match('/^.*?iphone 7(?:\s+(?:plus\s+)?\d+\s?gb.*)?$/i', $test)) {
echo "match\n";
} else {
echo "doesn't match\n";
}
}
<强>输出:强>
any digits or string apple iphone 7 ==> match
any digits or string apple iphone 7 16 gb ==> match
any digits or string apple iphone 7 32GB - Silver ==> match
any digits or string apple iphone 7 plus ==> doesn't match
any digits or string apple iphone 7s ==> doesn't match
答案 1 :(得分:0)
如果您真的只对字符串的Apple Iphone 7
位感兴趣,并且您正在使用PHP,那么为什么不这么做呢:
if (stripos($string,'Apple Iphone 7 Plus') !== FALSE) echo 'Wow a 7 Plus!';
else if (stripos($string,'Apple Iphone 7') !== FALSE) echo 'It is only a 7';
换句话说:尽可能避免使用复杂的正则表达式,只在需要时才使用它们。
答案 2 :(得分:0)
使用此正则表达式,您可以匹配,如果您想要可以提取一些有关它的信息
(?!apple iphone .* plus)(?:apple iphone 7)(?>\s(?<storage>\d+)?\s?(?:gb))?
您可以看到demo
我已经更新了一下,现在将与以下内容相匹配
与以下
不符