Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 要匹配12345的正则表达式_Regex_Pattern Matching - Fatal编程技术网

Regex 要匹配12345的正则表达式

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 {

是否有一个正则表达式来匹配不断增加的连续数字字符串,例如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 {
        #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