在perl上匹配这个正则表达式

时间:2015-12-10 07:56:26

标签: regex perl matching

我是Perl的新手,对于正则表达式更是如此。 一直试图匹配以下内容,但没有成功:

  • 首先,3至4个字母(理想情况下不区分大小写)
  • 可选择一个空格(但不是强制性的)
  • 然后,还可选择使用已知的大写字母(M)和1,2,3中的数字

有效字符串的示例是abc,还有DEFG M2。无效的格式为mem M,例如

到目前为止我所拥有的是:

$myExpr ~= m/^[a-z,A-z]{3,4}M[1,2,3]$/i

不确定如何使M和数字可选

3 个答案:

答案 0 :(得分:1)

使用(?:)对可选符号进行分组,并使用"零或一个"量词?

$myExpr =~ m/^[a-zA-Z]{3,4}(?: M[123])?$/

我还修复了你的正则表达式中的错误:你没有在角色类中使用, - 这已经意味着"匹配,",已修复A-Z范围并删除了/i修饰符,因为您没有说明是否需要小写字母M且第一个范围已涵盖小字母和大字母。

答案 1 :(得分:1)

您可以使用以下正则表达式。您不需要在字符类[]中使用逗号。同时删除i,因为您需要与M匹配。

$myExpr ~= m/^[a-zA-z]{3,4}(?: M[123])?$/

如果您认为自己的空间是可选的,那么请再次在该空格后添加?(即(?: ?M[123]))。

答案 2 :(得分:1)

为什么不为它尝试以下正则表达式:

$myExpr =~ m/^([a-zA-Z]{3,4})(\s|)(M|)([1-3]|)$/;
  • ([a-zA-Z]{3,4}) - 此类中任何字符的组:[a-zA-Z],重复3到4次。
  • (\s|) - 会有空格(空格)或不是
  • (M|) - 要么大写 M要么
  • ([1-3]|) - 此类别的任何章程: [1-3]或不

(或)尝试以下

我个人推荐这个

$myExpr =~ m/^([a-zA-Z]{3,4})(\s{0,1})(M{0,1})([1-3]{0,1})$/; 
  • ([a-zA-Z]{3,4}) - 此类中任何字符的组:[a-zA-Z],重复3到4次,即最少3个字符,最多4个字符。
  • (\s{0,1}) - 重复0到1次的\s组,即可选。
  • (M{0,1}) - 字符组 M ,重复次数为0到1,即可选。
  • ([1-3]{0,1}) - 任意数字 from 1 to 3 的组,重复次数为0到1,即可选。