如何创建正则表达式以排除2,102和103

时间:2012-03-29 00:51:12

标签: regex perl regex-negation

正则表达式应该允许所有其他数字。 感谢

4 个答案:

答案 0 :(得分:2)

与使用牙签砍伐树,或使用正则表达式解析XML,或在COBOL中编写操作系统,或使用Pascal执行任何的方式相同: - )

你没有。您使用正确的工具来完成工作,这类似于(伪代码):

if val = 2 or val = 102 or val = 103:
    return
# Process other values.

答案 1 :(得分:1)

允许任何数字更简单,然后在正则表达式之外排除你不想要的数字。

while (/([0-9]+)/g) {
   next if $1 == 2 || $1 == 102 || $1 == 103;
   say $1;
}

但是可以做到。

1.复杂模式,

/
   ...
   (?<![0-9])  # Possible to omit in some circumstances.
   (
      (?: 0
      |   [3-9][0-9]*
      |   2[0-9]+
      |   1(?:[1-8][0-9]*)?
      |   10([014-9][0-9]*)?
      |   10[23][0-9]+
      )
   )
   (?![0-9])   # Possible to omit in some circumstances.
   ...
/xg

2.将Perl代码嵌入模式

/
   ...
   (?<![0-9])  # Possible to omit in some circumstances.
   ([0-9]+)
   (?![0-9])   # Possible to omit in some circumstances.
   (?(?{ $^N == 2 || $^N == 102 || $^N == 103 })(?!))
   ...
/xg

3.否定前瞻

/
   ...
   (?<![0-9])  # Possible to omit in some circumstances.
   (?!(?:2|102|103)(?![0-9]))
   ([0-9]+)
   ...
/xg

棘手的部分是确保

  • 20场比赛
  • 102不匹配为10

答案 2 :(得分:1)

真正的正则表达式可编译为NFA / DFA:

length 1:

  [0-13-9]

length 2:

  [0-9][0-9]

length 3:

  [02-9][0-9][0-9]

  10[0-14-9]

  1[1-9][0-9]

length 4 or more:

  [0-9][0-9][0-9][0-9]+

combine:

  [0-13-9]|[0-9][0-9]|[02-9][0-9][0-9]|10[0-14-9]|1[1-9][0-9]|[0-9][0-9][0-9][0-9]+

grep line for validation:

  grep -E '^([0-13-9]|[0-9][0-9]|[02-9][0-9][0-9]|10[0-14-9]|1[1-9][0-9]|[0-9][0-9][0-9][0-9]+)$'

答案 3 :(得分:0)

嗯,嗯,你的意思是每行得到一个号码,扔出“2”等号码?

if ($a =~ /^(\s)*(10)?([23])(\s*)$/ || $a =~ /^(\s)*(2)(\s)*$/)
     {
                #bad string!  do whatever
     }
 else
    {
                #good string!
    }

匹配

2
102
103

就是说,一行只是你的“坏”数字,也许还有一些空格。 “111103444”,被认为是一个“好数字”,所以如果你的意思是过滤掉你的不良数字,请试试

$a =~ s/^(?:102|103|2)$//g;

技术上可能不是纯正的正则表达式......

为什么有人说不要将perl用于正则表达式?