我正在寻找如何创建一个正则表达式,它与String类中的“contains”方法完全等效。基本上,我有几千个我正在搜索的短语,而且根据我的理解,出于性能原因,编译正则表达式一次并使用它多次,比调用“mystring.contains(testString)”更好。重复使用不同的“mystring”值,使用相同的testString值。
编辑:扩展我的问题...我将有数千个“testString”值,我不想将它们转换为正则表达式机制理解的格式。我只是希望能够直接传入用户输入的短语,并查看是否找到了“mystring”恰好包含的值。 “testString”不会改变它的值,但会有成千上万的这就是为什么我想创建匹配器对象并一遍又一遍地重复使用它(显然我的正则表达式技能不符合要求)
答案 0 :(得分:2)
您可以在LITERAL
模式时使用compiling标志告诉引擎您正在使用文字字符串,例如:
Pattern p = Pattern.compile(yourString, Pattern.LITERAL);
但是你确实确保这样做然后重复使用结果比String#contains
更快?足以让复杂性值得吗?
答案 1 :(得分:1)
您可以使用Pattern.quote
为每个输入字符串获取“正则表达式”。您的任何条款是否包含换行符?如果是这样,那至少可以使生活变得有点棘手,尽管远非不可能。
无论如何,你基本上只是将引用的条款加在一起:
Pattern pattern = Pattern.compile("quoted1|quoted2|quoted3|...");
您可能希望使用Guava的Joiner
轻松地将引用的字符串连接在一起,但显然手动操作并不是非常困难。
但是,我会尝试这个,然后测试它是否实际上比调用contains
更有效。你有没有一个基准测试表明contains
太慢了?