正则表达式匹配“测试”而不是“test-1”

时间:2013-09-18 17:33:32

标签: java regex

我在java中使用正则表达式,并且我编写了以下表达式来查找我的搜索字符串。

String regex = "(?i)[a-zA-Z0-9_.-|]*" + searchString + "(?i)[a-zA-Z0-9_.-|]*";

我在DB中存储了两个String作为“testEcho”和“testEcho-1”。

当我将“test”作为我的搜索String传递时,上面的正则表达式模式仅返回“testEcho”作为结果。但它必须返回两个字符串。我的正则表达式有什么问题?

3 个答案:

答案 0 :(得分:2)

您的角色类有错误:

[a-zA-Z0-9_.-|]

需要

[a-zA-Z0-9_.|-]

否则,-不会被视为文字-,但会尝试构建.(ASCII 46)和|(ASCII 124)之间的字符范围,就像在A-Z中一样。

答案 1 :(得分:2)

如果没有转义,你不能在这样的字符类中加一个连字符。这有效地允许任何ASCII值介于.|之间的字符。相反,逃避连字符:

"(?i)[a-zA-Z0-9_.\\-|]*" + searchString + "(?i)[a-zA-Z0-9_.\\-|]*"

您也可以将连字符放在字符类的开头或结尾而不转义 - 只是不在中间。

答案 2 :(得分:1)

你必须像-那样逃避[a-zA-Z0-9_.\-|],否则它会认为它是一个范围.-|,这是没有意义的。

此外,没有必要使用双(?i),因为第一个持续到结束 您也可以将课程缩短到此(但无所谓)[\w.\-|] 您甚至可以将-放在类的开头或结尾,并将其视为文字,而不是范围运算符。

您还可以通过添加问号*?使课程量词非贪婪。

需要注意的另一件事是searchString本身,每个字符都应该是
转义或其中一些字符可以解释为正则表达式metachar的。

建议的正则表达式:

String regex = "(?i)[\\w.|-]*?" + EscapedsearchString + "[\\w.|-]*?";