正则表达式应该允许所有其他数字。 感谢
答案 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
棘手的部分是确保
答案 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)
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用于正则表达式?