正则表达式是匹配和替换文本的最佳方式吗?

时间:2009-10-18 19:09:50

标签: regex eclipse eclipse-plugin

我很清楚正则表达式是什么,所以请避免给我定义。我只是在寻找意见,甚至可能是一些建议。我很快就读毕业了,获得了计算机科学学位,到目前为止,我接受过正规表达的唯一教育是通过PL设计和开发课程。我们从未接受过关于它在我们编写的程序中的实际应用和使用的教育,只是使用Regex来实际使用编程语言。

我的问题是,我是否正确地假设正则表达式是匹配和处理文本的最强大的工具?如果我错了,还有什么我应该自学(而不是变成正则表达式)?另外,有没有人知道Eclipse IDE的任何好的正则表达式插件(最好是Galileo)。我正在寻找能够让我测试文档的东西,并且可能会突出显示正在做的事情。感谢

8 个答案:

答案 0 :(得分:7)

当我真正表达模式时,我会使用正则表达式。有些人喜欢使用正则表达式,而他们正在尝试做的事情很容易在很少的“原始”字符串操作中实现(indexOfsubstringcontains等)。

我发现它有时值得两次执行相同的操作 - 一次使用正则表达式,一次不使用。将代码保留一天,然后返回并查看它。想象一下您可能想要做出的一些改变 - 哪种实现更容易理解?哪一个更容易改变?有时这将是正则表达式,有时它将是原始字符串操作。

建议您使用评论记录正则表达式。特别是,任何时候你必须在构建正则表达式时查找内容时,这是文档的一个很好的候选者。 (这里有一些例外 - 我可以从不记住围绕$和^去哪个方向,但是当你看到一个工作表达式时它很明显。)

答案 1 :(得分:4)

这实际上取决于强大是什么意思。

就复杂性而言,例如,RegEx很难处理递归。您需要像JavaCC或YACC这样的编译器编译器(编译器生成)之类的东西来处理它。这就是为什么你不能完全从RegEx轻松创建XML解析器的原因。事情大部分时间都是RegEx足够复杂的。

就性能而言,RegEx无法与直接解析竞争。例如,如果要查看字符串是否以单词“Prefix”开头;在RegEx中你进入'/^Prefix.*/',但在非RegEx Java中,你进入'Str.startsWith("Prefix")'。两者的速度是无与伦比的。

但是,RegEx允许代码在许多情况下更易于管理。最简单的例子是,如果你想检查字符串是否以至少10个数字开头;在Java中,您可以写:

for(int i = 0; i < Math.min(10, Str.length); i++) {
    char C = Str.charAt(i);
    if ((C < '0') || (C > '0'))
        reutrn false;
}
return true;

与RegEx比较:

static final String CheckRegEx   = "^[0-9]{10,}+"; // So you have it expressed in one place
static final String CheckPattern = Pattern.compile(CheckRegEx);

if (CheckPattern.matches(Str)) {
    // Match
}

使用RegEx的代码更易于管理。

我想说的是,每项技术都有交易,必须保持平衡。

对于大多数情况,RegEx是一个非常好的工具,可以用来完成它的工作。

答案 2 :(得分:2)

  

另外,有没有人知道任何好的正则表达式   Eclipse IDE的插件(Galileo   优选地)。

我喜欢Quickrex plugin for Eclipse - 很容易将其整合到您最喜欢的视图中。

答案 3 :(得分:2)

Regex专门用于在文本中查找字符串。

还有其他方法可以做到这一点,但它们是有限的和语言特定的。

正则表达式是一个非常强大的工具,它也是一种技术/语法可能会持续很长时间。因此,在你的职业生涯开始时,它是一个非常好的候选人。

答案 4 :(得分:2)

一旦你学习正则表达式,它们就会非常强大。如果RE以您选择的语言(例如Perl,Ruby或Python)提供一流的公民身份,这将有所帮助。如果它们深埋在图书馆中,它们就会变得很麻烦。

我通常用支持正则表达式的语言编写程序。我可以轻松地评估我的时间和运行时间之间的权衡。在运行时使用substr()和index()可能会快几毫秒。但如果它归结为在30秒内制作正则表达式与编程和调试字符串操作函数组合的5分钟之间的差异,我几乎每次都会投票给RE。

答案 5 :(得分:2)

我想大部分正则表达式的优点和缺点都已经提到了。我只想补充说,在决定将正则表达式应用于特定问题之前,它有助于理解正则表达式的实现方式。这article可能会有所帮助。

答案 6 :(得分:2)

正则表达式无疑是匹配文本的一种非常强大的方式,即常规语言。当然,今天的正则表达式引擎处理远远超过常规语言(通过递归,代码插入和其他技巧)。

正则表达式之外的下一步是语法解析器(yacc,bison等)。如果你对解析感兴趣,我建议你看一下即将在perl6中实现的语法解析器,它似乎提供了一个非常强大的正则表达式和基于语法的解析混合,远远超出了传统正则表达式的限制

答案 7 :(得分:1)

正则表达式是匹配和替换字符串的最佳工具,除非它们不是。在日志文件或文本语料库中?真棒。在XML或HTML文档中?可怕。这实际上取决于您尝试处理的文本的结构和含义。