我在java中使用正则表达式,并且我编写了以下表达式来查找我的搜索字符串。
String regex = "(?i)[a-zA-Z0-9_.-|]*" + searchString + "(?i)[a-zA-Z0-9_.-|]*";
我在DB中存储了两个String
作为“testEcho”和“testEcho-1”。
当我将“test”作为我的搜索String
传递时,上面的正则表达式模式仅返回“testEcho”作为结果。但它必须返回两个字符串。我的正则表达式有什么问题?
答案 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.|-]*?";