繁体   English   中英

如何正确使用Java Pattern对象来匹配字符串模式

[英]How to properly use java Pattern object to match string patterns

我编写了执行几个字符串操作的代码,包括检查给定的字符串是否与某个正则表达式匹配。 它在输入70,000时运行得很好,但是当我迭代运行它进行五重交叉验证时,它开始给我带来内存不足的错误。 可能是我必须分配更多的内存,但是我感觉自己可能编写了效率低下的代码,因此想仔细检查一下我是否没有犯任何明显的错误。

     static Pattern numberPattern = Pattern.compile("^[a-zA-Z]*([0-9]+).*");
     public static boolean someMethod(String line) {
         String[] tokens = line.split(" ");
         for(int i=0; i<tokens.length; i++) {
             tokens[i] = tokens[i].replace(",", "");
             tokens[i] = tokens[i].replace(";", "");
             if(numberPattern.matcher(tokens[i]).find()) return true; 
          }
    return false;
}

而且我也有很多类似下面的行:

        token.matches("[a-z]+[A-Z][a-z]+"); 

哪种方法更有效地利用内存? 它们看起来足够有效吗? 任何建议表示赞赏!

编辑:

抱歉,我输入了错误的代码,我打算在发布此问题之前对其进行修改,但我在最后一刻忘记了。 但是问题是,除了示例代码没有意义的事实之外,我到处都有许多类似的操作,我想知道正则表达式比较部分是否有效。

感谢您的所有评论,我将按照建议仔细阅读并修改代码!

好吧,首先,请再看一遍您的代码...它将始终返回“ true”值! 您不是在读取“匹配”变量,而是在输入值。

第二,String是不可变的,因此,每次拆分时,您都在创建另一个实例...为什么不尝试创建一个使匹配项忽略逗号和分号的模式呢? 我不确定,但我认为这会减少您的记忆力...

是的,这段代码确实效率低下,因为一旦发现match = true;您可以立即返回match = true; (没有意义继续循环)。

此外,您确定需要将行分成tokens吗? 为什么不只检查一次正则表达式?

最后,如果所有比较检查均失败,则应返回false (最后一行)。

您可以将所有内容都放在正则表达式中,而无需更改和拆分文本。

// the \\b means it must be the start of the String or a word
static Pattern numberPattern = Pattern.compile("\\b[a-zA-Z,;]*[0-9,;]*[0-9]");

// return true if the string contains 
// a number which might have letters in front
public static boolean someMethod(String line) {
     return numberPattern.matcher(line).find());
}

除了@alfasin在回答中提到的内容外,您还应避免重复代码。 重写以下内容:

{
    tokens[i] = tokens[i].replace(",", "");
    tokens[i] = tokens[i].replace(";", "");
}

成:

tokens[i] = tokens[i].replaceAll(",|;", "");

并且请在.split()之前进行计算,这样就不必在循环中重复该操作:

String[] tokens = line.replaceAll(",|;", "").split(" ");
                      ^^^^^^^^^^^^^^^^^^^^^^

编辑:盯着你的代码了一段时间后,我认为我有一个更好的解决方案,使用正则表达式;)

public static boolean someMethod(String line) {
    return Pattern.compile("\\b[a-zA-Z]*\\d")
             .matcher(line.replaceAll(",|;", "")).find();
}

在线正则表达式演示
在线代码演示

  • \\b是单词边界。
  • 它在一个单词的边界处声明位置(行首+空格后)

代码演示STDOUT:

foo不匹配
条不匹配
bar1确实匹配
foo baz bar bar1 lolz符合
password_01不匹配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM