Regex 要匹配12345的正则表达式
是否有一个正则表达式来匹配不断增加的连续数字字符串,例如123、56789等? 我认为它不可能出现在正则表达式中,但值得在这里与大家一起检查。在Perl中:Regex 要匹配12345的正则表达式,regex,pattern-matching,Regex,Pattern Matching,是否有一个正则表达式来匹配不断增加的连续数字字符串,例如123、56789等? 我认为它不可能出现在正则表达式中,但值得在这里与大家一起检查。在Perl中: my $prev = 0; while($string =~ s/^\s*(\d+)\s*,\s*(.*)/$2/is) { my $new = $1; if($new > $prev) { #NUMBERS ARE GETTING LARGER } #if else {
my $prev = 0;
while($string =~ s/^\s*(\d+)\s*,\s*(.*)/$2/is) {
my $new = $1;
if($new > $prev) {
#NUMBERS ARE GETTING LARGER
} #if
else {
#NUMBER GOT SMALLERS
}
}
结果:
Python演示:
>>> import re
>>> good = ['1', '12', '123', '23', '3', '4', '45', '456', '56', '6', '7', '78', '789', '89', '9', '123456789']
>>> bad = ['a', '11', '13', '1345', '2459', '321', '641', '1 2', '222233334444']
>>> tests = good + bad
>>>
>>> regex = '^(1|^)((2|^)((3|^)((4|^)((5|^)((6|^)((7|^)((8|^)((9|^))?)?)?)?)?)?)?)?$'
>>> for test in tests:
... print '%s: %s' % (re.match(regex, test) and 'Passed' or 'Failed', test)
...
Passed: 1
Passed: 12
Passed: 123
Passed: 23
Passed: 3
Passed: 4
Passed: 45
Passed: 456
Passed: 56
Passed: 6
Passed: 7
Passed: 78
Passed: 789
Passed: 89
Passed: 9
Passed: 123456789
Failed: a
Failed: 11
Failed: 13
Failed: 1345
Failed: 2459
Failed: 321
Failed: 641
Failed: 1 2
Failed: 222233334444
是否有一个正则表达式来匹配不断增加的连续数字字符串,例如123、56789等
但当然有,因为所有问题的答案都是从“是否有(Perl)正则表达式匹配…”开始的,始终是“为什么,当然有!”操作性问题始终是“匹配的Perl正则表达式是什么…”☺
简短回答
Perl正则表达式是这样的:
m{
^ (
( \d )
(?(?= ( \d )) | $)
(?(?{ ord $3 == 1 + ord $2 }) (?1) | $)
) $
}x
If通过两个不同的(?(COND)THEN | ELSE)
条件组工作,其中第二个条件组的THEN子句是组1上的递归。这就是(?1)
所做的
漂亮,嗯
递归模式像这样的模式非常酷,功能也非常强大;这取决于你使用这种力量为善服务,而不是为恶服务。☺
我在下面给出的程序中使用了一种稍微不那么聪明的形式。我将把另一个放在它开始的地方,这样您就可以看到在Perl中有不止一种方法
完整演示程序
请注意,无论Unicode数字串是什么,包括非ASCII(欢迎来到勇敢的新千年),甚至是在星体层面,在那里语言停留在UCS-2上,有时甚至是UTF-16,甚至无法思考
此输出:
是:3456
编号:43
是:567
编号:1245
编号:568
编号:987
是:12
是:12345
编号:24
编号:13456
编号:12354678
是:12345678
否:١٠٢
是的,是的
不:२१३
对:४५६७
对:८९
不:১১২
对:৩৪৫৬
不:৭৮৯৮
对:௮௯
不:௮௮
不:๖๗๗๘
对:๖๗๘
不:༣༤༢༥༧༦༨
不:01132
对:234
对:89
是的:在1之前是零,对吗?看来我的投票结果让你的代表加起来有8万:)肯尼特:真是太重复了。试试递归。不要拘泥于ASCII。@tchrist在正则表达式的上下文中,我一直听到的这种“递归”无意义是什么?除了Perl的不规则“正则”表达式之外,我无法将它放在NFA附近的任何地方。@pst:错。它所需要的只是从病态的、愚蠢的、无用的、完全不规则的规则语言定义中取消模式语言的资格。没有人关心现代模式中的自动机理论。精心设计的背景参考、条件和是都是当今时代实践模式景观的一部分。没有人会被不切实际的“不规则规则”正则表达式所困扰。你不能用如此刻板和贫乏的语言来完成这项工作。不,谢谢@tchrist您喜欢Perl。它有强大的正则表达式。现在,如果这个问题(或者您已经回答的许多问题)被标记为Perl或者暗示Perl,那么您是否可以停止(错误的)假设这些(Perl特性)是可用的?承认某些构造是Perl正则表达式构造,而不批评其他任何方法都是很好的(特别是在没有添加“仅Perl很棒”注释的情况下)。我仍然很好奇如何接受这种语言:“S->S | SS,S->(S),S->()”而不是使用Perl/PCRE。非常好的重复。现在让它也适用于孟加拉数字,如৭৮৯৮, 泰米尔数字௮௯, 泰国数字像༣༤༢༥༧༦༨, 全宽数字,如“01132", 数学上的无衬线粗体数字是U+1D7ED,Python害怕涉足其中。:)Perl可以做得更好;事实上要好得多。:)这只在Perl中起作用,因为?{…}
。虽然您的解决方案支持Unicode的任何部分,但如果OP不使用Perl,它是无用的。
>>> import re
>>> good = ['1', '12', '123', '23', '3', '4', '45', '456', '56', '6', '7', '78', '789', '89', '9', '123456789']
>>> bad = ['a', '11', '13', '1345', '2459', '321', '641', '1 2', '222233334444']
>>> tests = good + bad
>>>
>>> regex = '^(1|^)((2|^)((3|^)((4|^)((5|^)((6|^)((7|^)((8|^)((9|^))?)?)?)?)?)?)?)?$'
>>> for test in tests:
... print '%s: %s' % (re.match(regex, test) and 'Passed' or 'Failed', test)
...
Passed: 1
Passed: 12
Passed: 123
Passed: 23
Passed: 3
Passed: 4
Passed: 45
Passed: 456
Passed: 56
Passed: 6
Passed: 7
Passed: 78
Passed: 789
Passed: 89
Passed: 9
Passed: 123456789
Failed: a
Failed: 11
Failed: 13
Failed: 1345
Failed: 2459
Failed: 321
Failed: 641
Failed: 1 2
Failed: 222233334444
m{
^ (
( \d )
(?(?= ( \d )) | $)
(?(?{ ord $3 == 1 + ord $2 }) (?1) | $)
) $
}x