字符集正则表达式

时间:2016-08-15 07:41:43

标签: php regex

我正在开展一个项目,我必须验证BECS字符。批量电子结算系统(BECS)仅允许使用以下字符。

BECS字符集

Type                        Description
Numeric                     0 to 9
Alphabetic                  Uppercase A to Z and Lowercase a to z
+                           Plus sign
-                           Minus sign or hyphen
@                           At sign
SP                          Blank space
$                           Dollar sign
!                           Exclamation mark
%                           Percentage sign
&                           Ampersand
(                           Left Parenthesis
)                           Right Parenthesis
*                           Asterik
.                           Period or decimal point
/                           Solidus (slash)
#                           Number Sign (Pound or Hash)
=                           Equal Sign
:                           Colon
;                           Semicolon
?                           Question mark
,                           Comma
’                           Apostrophe
[                           Left square bracket
]                           Right square bracket
_                           Low line (underscore)
^                           Circumflex

我尝试过以下但不能正常工作:

preg_match("/^[A-Za-z0-9^_[]',?;:=#/.*()&%!$ @+-]+$/", $string);

3 个答案:

答案 0 :(得分:5)

不要担心手动转义,而是使用preg_quote

然后代码就是 preg_match("/^[A-Za-z0-9".preg_quote("^_[]',?;:=#/.*()&%!$ @+-", "/")."]+$/", $string);

答案 1 :(得分:3)

character classes内,您无需转义大多数元字符。

/^[A-Za-z0-9^_[\]',?;:=#\/.*()&%!$ @+-]+$/
    转义
  • ]以阻止其关闭字符类
  • /需要转义,因为我们将其用作正则表达式分隔符
  • -不需要转义,因为它是班级中的最后一个字符
  • ^不需要转义,因为它不是班级中的第一个角色


或者,如果您想要更短的表达式,以下正则表达式涵盖相同的范围:

/^[ !#-;=?-[\]^_a-z]+$/

答案 2 :(得分:1)

你必须逃避字符串中的大多数字符,因为它们在正则表达式中具有特殊含义

(当然你没有逃过领先的q1和尾随的^,因为它们表明行中没有其他字符):

$

对于记录,BECS允许的字符与正则表达式字符列表:

preg_match("/^[A-Za-z0-9\\^_\\[\\]',\\?;:=#/\\.\\*\\(\\)\\&\\%!\\$ @\\+\\-]+$/", $string);