正则表达式匹配“测试”而非“测试-1”

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

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

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

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

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

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

您还可以通过添加问号*?来使类量词非贪婪*?

另外需要注意的是searchString本身,每个字符应该是
逃脱或其中的一些角色可以被解释为正则表达式的metachar’s。

建议的正则表达式:

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

您的角色类有错误:

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

需要是

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

否则, -不被视为文字-但尝试构造一个字符范围. (ASCII 46)和| (ASCII 124),就像AZ

如果不转义连字符,就不能将连字符放在类似的字符类中。 这有效地允许任何ASCII值介于其之间的字符.| 。 相反,逃避连字符:

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

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