假设有一个数组如下:
$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');
我只需要包含 4 字符的元素仅。所以除 foo12345bar 外,其他3个元素都有效。
因为'\d{4}'
会匹配 foo12345bar ,所以我会笨拙地尝试:
$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');
$result = array();
foreach ($arr as $value) {
preg_match('/\d+/', $value, $match);
if (strlen($match[0]) != 4) {
continue;
}
$result[] = $value;
}
var_dump($result); //array('foo1234bar', 'foo1234', '1234bar')
是否有直接匹配的正则表达式(因此可以省略 if 条件)?先感谢您。
答案 0 :(得分:5)
使用环顾正则表达式和preg_grep
function:
$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');
print_r(preg_grep('/(?<!\d)\d{4}(?!\d)/', $arr));
RegEx分手:
(?<!\d) # assert previous char is not a digit
\d{4} # match exact 4 digits
(?!\d) # assert next char is not a digit
<强>输出:强>
Array
(
[0] => foo1234bar
[1] => foo1234
[2] => 1234bar
)
答案 1 :(得分:1)
修改你的正则表达式如下
/^\D*\d{4}\D*$/
^
你的字符串必须以
开头
\D
任何非数字字母
*
从0到无限次重复
\d{4}
后跟任意数字完全重复4次
\D
后跟任何非数字字母
*
从0到无限次重复
$
字符串的结尾
此外,您可以按如下方式修改代码
$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');
$result = array_filter(
$arr,
function($element) {
return preg_match('/^\D*\d{4}\D*$/', $element);
}
);
var_dump($result);
由于OP没有指定它,这个正则表达式甚至会匹配1234(前面或后面没有非数字字符的任何四位数字符串)。如果他希望在前面或后面至少有一个字符,那么必须改变这个正则表达式。
答案 2 :(得分:1)
假设数字前后的字符始终是按字母顺序排列的,您可以使用此正则表达式:
^[a-zA-Z]*\d{4}[a-zA-Z]+$
答案 3 :(得分:0)
正则表达式为\ d {4}
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</context-param>
<!-- Add this to your web.xml to enable "CORS" -->
<filter>
<filter-name>cors</filter-name>
<filter-class>com.demo.mongo.example.filter.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
期待会有所帮助
答案 4 :(得分:0)
您可以尝试下列内容:
preg_match('/\D\d{4}\D/', $value, $match);
它搜索:
不是数字(/ D)
4位数(/ d {4})
再次是非数字(/ D)
答案 5 :(得分:0)
此正则表达式适用于您的所有示例:
'/^\D*(\d{4})\D*$/'
││ │ │ └── end string
││ │ └───── zero or more NOT digits
││ └─────────── four digits ( match 1 )
│└─────────────── zero or more NOT digits
└──────────────── start string
如果字符串中有多个数字组('123abc1234o'),它们就不起作用。