每个表达式至少包含一个的正则表达式

时间:2019-03-23 17:15:18

标签: php regex

我正在尝试大写具有至少一个数字,字母和特殊字符(例如,句号或破折号)的“单词”。

类似3370.01b6510.01.bm-5510.30drm-2013-c-004914之类的东西。

我不希望它与hellosk8mixed-up之类的东西匹配

我正在尝试使用前瞻性as suggested,但无法匹配任何内容。

$output = preg_replace_callback('/\b(?=.*[0-9]+)(?=.*[a-z]+)(?=.*[\.-]+)\b/i', function($matches){return strtoupper($matches[0]);}, $input);

3 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式匹配所需的字符串,

(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+

说明:

  • (?=\S*[a-z])-这种前瞻性确保输入的单词中至少有一个字母字符
  • (?=\S*\d)-这种前瞻性确保输入的单词中至少有一个数字
  • [a-z\d]+(?:[.-][a-z\d]+)+-该部分捕获包含字母数字的单词,该单词包含至少一个特殊字符.-

Online Demo

这是修改您的代码的PHP代码演示,

$input = '3370.01b, 6510.01.b, m-5510.30, and drm-2013-c-004914 hello, sk8, and mixed-up';
$output = preg_replace_callback('/(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+/i', function($matches){return strtoupper($matches[0]);}, $input);
echo $output;

打印

3370.01B, 6510.01.B, M-5510.30, and DRM-2013-C-004914 hello, sk8, and mixed-up

答案 1 :(得分:0)

我认为您从未捕获任何可放入比赛的东西...

$input = '3370.01b foo';
$output = preg_replace_callback('/(?=.*[0-9])(?=.*[a-z])(\w+(?:[-.]\w+)+)/i', function($matches){return strtoupper($matches[0]);}, $input);

echo $output;

输出

3370.01B foo

Sandbox

https://regex101.com/r/syJWMN/1

答案 2 :(得分:0)

正则表达式:

https://regex101.com/r/sdmlL8/1

(?=.*\d)(.*)([-.])(.*)

PHP代码:

https://ideone.com/qEBZQc

$input = '3370.01b';
$output = preg_replace_callback('/(?=.*\d)(.*)([-.])(.*)/i', function($matches){return strtoupper($matches[0]);}, $input);