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

Match this regex on perl

我对 Perl 还很陌生,对正则表达式更是如此。 一直在尝试匹配以下,但没有成功:

有效字符串的一个示例是 abc,但也可能是 DEFG M2。无效的是mem M,例如

我目前拥有的是:

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

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

将您的可选符号与 (?:) 分组并使用 "zero or one" 量词 ?

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

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

您可以使用以下正则表达式。您不需要在字符 class [] 内使用逗号。并删除 i 因为你需要匹配 M.

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

如果您认为 space 是可选的,那么在 space 之后再次添加 ?(即 (?: ?M[123]))。

你为什么不试试下面的正则表达式呢:

$myExpr =~ m/^([a-zA-Z]{3,4})(\s|)(M|)([1-3]|)$/;
  • ([a-zA-Z]{3,4}) - 此 class 中任何字符的组:[a-zA-Z],重复 3 到 4 次。
  • (\s|) - 要么有 white-space(space) 要么没有.
  • (M|) - 要么有大写 M 要么没有.
  • ([1-3]|) - 这个 class 是否有任何章程:[1-3] 或没有.

(或)尝试以下

个人推荐这个

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