测试正则表达式的推荐方法?

时间:2009-10-06 22:55:27

标签: regex linux

我是正则表达式的新手,我已经能够通过试验和错误编写一些内容,所以尝试了一些程序来帮助我编写表达式,但程序比正则表达式本身更难理解。有推荐的程序吗?我在Linux下完成大部分编程。

11 个答案:

答案 0 :(得分:7)

为Perl尝试YAPE::Regex::Explain

#!/usr/bin/perl

use strict;
use warnings;

use YAPE::Regex::Explain;

print YAPE::Regex::Explain->new(
    qr/^\A\w{2,5}0{2}\S \n?\z/i
)->explain;

<强>输出:

The regular expression:

(?i-msx:^\A\w{2,5}0{2}\S \n?\z)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?i-msx:                 group, but do not capture (case-insensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  \A                       the beginning of the string
----------------------------------------------------------------------
  \w{2,5}                  word characters (a-z, A-Z, 0-9, _)
                           (between 2 and 5 times (matching the most
                           amount possible))
----------------------------------------------------------------------
  0{2}                     '0' (2 times)
----------------------------------------------------------------------
  \S                       non-whitespace (all but \n, \r, \t, \f,
                           and " ")
----------------------------------------------------------------------
                           ' '
----------------------------------------------------------------------
  \n?                      '\n' (newline) (optional (matching the
                           most amount possible))
----------------------------------------------------------------------
  \z                       the end of the string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

答案 1 :(得分:5)

RegexPal是一款出色的免费JavaScript正则表达式测试程序。因为它使用JavaScript正则表达式引擎,所以它没有一些更高级的正则表达式功能,但它适用于许多正则表达式。我最想念的功能是后视断言。

答案 2 :(得分:4)

大多数正则表达式错误分为三类:

  • 微妙的遗漏 - 在开始时遗漏“^”或在结尾处“$”,使用“*”本来应该使用'+' - 这些只是初学者的错误,但是对于错误的正则表达式来说,它仍然可以通过所有的自动化测试。

  • 意外成功 - 正则表达式的一部分完全错误,并且注定要在99%的现实世界中使用失败,但是由于纯粹的愚蠢运气,它设法通过了一半 - 你写的十几个自动化测试。

  • 成功太多 - 正则表达式的一部分比您想象的要多得多。例如,令牌[^., ]*也会匹配\r\n,这意味着您的正则表达式现在可以匹配多行文本,即使您将其包装在^和{{{ 1}}。

确实有 no 替代正确学习正则表达式。阅读正则表达式引擎上的参考手册,并使用像Regex Buddy这样的工具来实验并熟悉所有功能,特别注意他们可以展示的任何特殊或不寻常的行为。如果你正确地学习正则表达式,你将避免上面提到的大多数错误,并且你将知道如何编写少量自动化测试,这些测试可以保证所有边缘情况而不会过度测试明显的事情({{1}真的匹配 A和A之间的每个字母吗?我最好写出单元测试的26种变体来确保!)。

如果你没有完全学习正则表达式,你需要写一些荒谬的量的自动化测试来证明你的魔法正则表达式是正确的。

答案 3 :(得分:3)

不幸的是,如果您正在运行Linux,那么您将无法访问其中最好的一个:Regex Buddy

  

RegexBuddy是您处理正则表达式的完美伴侣。轻松创建与您想要的完全匹配的正则表达式。清楚地理解其他人写的复杂正则表达式。快速测试样本字符串和文件上的任何正则表达式,防止实际数据出错。通过逐步实际的匹配过程进行调试而不需要猜测。使用带有源代码片段的正则表达式自动调整到您的编程语言的详细信息。收集并记录正则表达式库以供将来重用。通过文件和文件夹进行GREP(搜索和替换)。将RegexBuddy与您最喜爱的搜索和编辑工具集成,以便即时访问。 (来自他们的网站)

答案 4 :(得分:2)

一个帮助你写正则表达式的好程序是Perl;你可以尝试一个正则表达式,看看它是否很容易匹配:

perl -e 'print "yes!\n" if "string" =~ /regex to test/'

有关测试正则表达式的更多信息,请参阅this SO question on unit testing regexes

答案 5 :(得分:1)

您可以尝试使用提供提示和即时满足感的网站,例如this one。将您可以轻松修改的简单perl脚本放在一起也是一个很好的测试基础。如下所示:

#!/usr/bin/perl

$mystring = "My cat likes to eat tomatoes.";
$mystring =~ s/cat/dog/g;
print $mystring;

答案 6 :(得分:1)

另请查看re pragma,它将显示如何编译正则表达式以及它们的执行方式:

$ perl -Mre=debugcolor -e '"huzza" =~ /^(hu)?z{1,2}za$/'

输出是:

    Compiling REx "^(hu)?z{1,2}za$"
    Final program:
       1: BOL (2)
       2: CURLYM[1] {0,1} (12)
       6:   EXACT  (10)
      10:   SUCCEED (0)
      11: NOTHING (12)
      12: CURLY {1,2} (16)
      14:   EXACT  (0)
      16: EXACT  (18)
      18: EOL (19)
      19: END (0)
    floating "zza"$ at 0..3 (checking floating) anchored(BOL) minlen 3 
    Guessing start of match in sv for REx "^(hu)?z{1,2}za$" against "huzza"
    Found floating substr "zza"$ at offset 2...
    Guessed: match at offset 0
    Matching REx "^(hu)?z{1,2}za$" against "huzza"
       0           |  1:BOL(2)
       0           |  2:CURLYM[1] {0,1}(12)
       0           |  6:  EXACT (10)
       2           | 10:  SUCCEED(0)
                                        subpattern success...
                                      CURLYM now matched 1 times, len=2...
                                      CURLYM trying tail with matches=1...
       2           | 12:  CURLY {1,2}(16)
                                        EXACT  can match 2 times out of 2...
       3           | 16:    EXACT (18)
       5           | 18:    EOL(19)
       5           | 19:    END(0)
    Match successful!
    Freeing REx: "^(hu)?z{1,2}za$"

答案 7 :(得分:1)

http://regex-test.com是一个非常好/专业的网站,可以让你测试许多不同类型的正则表达式。

答案 8 :(得分:1)

我个人最喜欢的是Rubular(免责声明:在线工具)。

这很好,很简单,也很快。

答案 9 :(得分:0)

如果您准备购买工具Komodo,ActiveState是一个很棒的脚本语言编辑器,并附带一个强大的正则表达式助手。它是跨平台的,但不是免费的。当我不太清楚为什么事情没有解析并且支持几种类型的regexen变种时,它帮助我摆脱了一些紧张的情况。

答案 10 :(得分:0)

Kudos是一款出色的免费跨平台正则表达式调试器。