-1

代码的正则表达式

    String inputOne = "cat cat cat cattie cat";
    String findStr = "cat";
    Pattern p = Pattern.compile("cat");
    Matcher m = p.matcher(inputOne);
    int countOne = 0;
    while (m.find()) {
        countOne++;
    }
    System.out.println("Match number " + countOne);

代码的字符串比较

   String inpuTwo = "cat cat cat cattie cat";
   int lastIndex = 0;
   int count = 0;
   while (lastIndex != -1) {
       lastIndex = inpuTwo.indexOf("cat", lastIndex);
       if (lastIndex != -1) {
            count++;
            lastIndex += findStr.length();
       }
   }
   System.out.println("Match number " + count);

在两者中都会在输入字符串“cat cat cat cattie cat”中找到子字符串“cat”的出现。

我的问题是它们之间有什么区别?

正则表达式比字符串比较有什么优势。

我应该将哪一个用于应用程序。正则表达式还是字符串比较?。

谢谢。

4

4 回答 4

13

两者完全不同,所以答案很大程度上取决于手头的任务。

如果您使用不带元字符的正则表达式,请改用基于字符串的比较:它们更容易理解,并且不会在不属于它的地方引入复杂性(这里是深入探讨这一点的文章的链接)。

正则表达式的威力始于元字符的使用。如果您需要定义要捕获的字符串而不是一一枚举,则应使用正则表达式。

于 2013-08-18T16:09:20.630 回答
4

您提供的示例非常基本。也许正则表达式真的不是这种情况的最佳答案。正则表达式有很多用途。我在 ETL 工作中经常使用正则表达式,我试图识别一条信息并将其提取出来。我经常混合使用lookbehinds、捕获组和字符集。使用高级正则表达式比以编程方式做事要容易得多。

一个例子是,我的一个朋友需要一个正则表达式,它可以从字符串中获取有效的金额,无论他们是否有逗号......并且只有在有三个逗号的情况下才会这样做。我为此写的正则表达式是:

(?<=\$)\d{1,3}(,?\d{3})*.\d{2}(?!\d)

(?<=\$)是一个积极的回顾。这就是说 $ 必须在主要匹配之前但不包括在内。

\d{1,3}正在寻找 1 到 3 个数字。

,?匹配逗号,但使其可选。

\d{3}又是 3 个数字。

将所有内容放在一个组中,*之后匹配该序列的 0 个或多个。

\.\d{2}(?!\d)确保我们有美分但只有 2 位数的价值。这(?!\d)是一个负前瞻,意味着在主匹配之后不能有另一个数字。如果存在则使匹配无效。

这个正则表达式将非常难以以编程方式编写,并且会花费大量时间。使用正则表达式可以节省时间,如果您了解正则表达式,可以更轻松地一目了然地了解正在发生的事情。

此正则表达式匹配以下内容:

1,000,000.00 美元和 100000.00 美元

但不匹配以下内容:

1,00,000.00 美元或 1000.000 美元

然后可以从匹配值中删除逗号,然后您可以将其解析为数字数据类型。

于 2013-08-18T16:11:37.743 回答
3

在您的示例中,两者都可以。正则表达式读起来更清晰一些,但意义不大。

正则表达式的真正优势来自于你需要做一些更复杂的事情。例如,您将如何编写非正则表达式代码来查找连续两位数的次数?(你可以,但它会更长的代码和更难阅读)

正则表达式将是“\d\d”。在没有正则表达式的情况下编写它需要大量的 if 语句。

于 2013-08-18T16:10:05.700 回答
1

当内置功能不足以满足特定场景(例如我们正在研究做复杂的事情)时,正则表达式很有用。但在某些情况下,我们可以使用内置函数或正则表达式。我认为使用正则表达式也会缩短代码并且有效但会降低代码的可读性。

于 2013-08-18T16:06:32.513 回答