[英]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.