1

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

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

我有两个String存储在数据库中,分别为“testEcho”和“testEcho-1”。

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

4

3 回答 3

2

您的角色类有一个错误:

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

需要是

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

否则,-不会将 视为文字-,而是尝试构造.(ASCII 46) 和|(ASCII 124) 之间的字符范围,就像 in 一样A-Z

于 2013-09-18T17:35:32.143 回答
2

您不能在不转义的情况下将连字符放在这样的字符类中。这有效地允许任何 ASCII 值介于.和之间的字符|。相反,请转义连字符:

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

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

于 2013-09-18T17:36:23.143 回答
1

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

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

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

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

建议的正则表达式:

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

于 2013-09-18T17:46:55.440 回答