Java “正则表达式匹配”;测试“;不是";测试-1“;

Java “正则表达式匹配”;测试“;不是";测试-1“;,java,regex,Java,Regex,我在java中使用正则表达式,我编写了以下表达式来查找搜索字符串 String regex = "(?i)[a-zA-Z0-9_.-|]*" + searchString + "(?i)[a-zA-Z0-9_.-|]*"; 我有两个字符串存储在数据库中,分别为“testEcho”和“testEcho-1” 当我通过“test”作为搜索字符串时,上面的正则表达式模式只返回“testEcho”作为结果。但它必须同时返回两个字符串。“我的正则表达式”中有什么错误?您的字符类有错误: [a-zA-Z0

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

String regex = "(?i)[a-zA-Z0-9_.-|]*" + searchString + "(?i)[a-zA-Z0-9_.-|]*";
我有两个
字符串
存储在数据库中,分别为“testEcho”和“testEcho-1”


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

您的字符类有错误:

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

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

否则,
-
不会被视为文字
-
,而是尝试在
(ASCII 46)和
(ASCII 124)之间构建字符范围,就像在
a-Z

中一样,您的字符类出现错误:

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

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

否则,
-
不会被视为文字
-
,而是尝试在
(ASCII 46)和
(ASCII 124)之间构造一个字符范围,就像在
a-Z

中一样,不能在这样的字符类中放置连字符而不转义它。这实际上允许任何ASCII值介于
|
之间的字符。相反,请退出连字符:

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

你也可以把字符连在字符类的开头或结尾,而不是在中间。只是:

你不能在这样的字符类中加上连字符,而不需要它。这实际上允许任何ASCII值介于
|
之间的字符。相反,请退出连字符:

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

你也可以把字符连在字符类的开头或结尾,而不是在中间。

你必须逃出<代码> ->代码>,像这样的代码> [AZ-Z0-9],\ -\ ] /<代码>,否则它认为一个范围<代码> --< < /代码>,这是没有意义的。p> 此外,无需使用双
(?i)
,因为第一个持续到最后。
您还可以将类缩短到这个长度(但这并不重要)
[\w.\-\124;]

您甚至可以将
-
放在类的开头或结尾,并将其视为文本,而不是范围运算符

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

另一件需要注意的事情是搜索字符串本身,每个字符都应该是
转义字符或其某些字符可以解释为正则表达式元字符

建议的正则表达式:


String regex=“(?i)[\\w.|-]*?”+转义搜索字符串+“[\\w.|-]*?”

你必须避开
-
,就像这样
[a-zA-Z0-9.\-\124;]
,否则它会认为它是一个范围
-
,这没有意义

此外,无需使用双
(?i)
,因为第一个持续到最后。
您还可以将类缩短到这个长度(但这并不重要)
[\w.\-\124;]

您甚至可以将
-
放在类的开头或结尾,并将其视为文本,而不是范围运算符

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

另一件需要注意的事情是搜索字符串本身,每个字符都应该是
转义字符或其某些字符可以解释为正则表达式元字符

建议的正则表达式:


String regex=“(?i)[\\w.|-]*?”+转义搜索字符串+“[\\w.|-]*?”

查看regexpal.com,这是调试正则表达式的有用工具,在正则表达式中不需要
(?i)
两次。另外,您可以使用
\\w
.FYI代替
a-zA-Z0-9
,没有理由将
(?i)
放在第二个字符串文本中,除非您认为
searchString
可能包含
(?-i)
。搜索例程会将其视为一个大字符串——它不会知道在上面的表达式中它由三个部分组成。因此,第二个
(?i)
是冗余的。另外,如果
searchString
可能包含正则表达式所特有的字符,您应该将其更改为
Pattern.quote(searchString)
,除非您希望它们是特殊的。请访问regexpal.com,这是调试正则表达式的有用工具,您不需要在正则表达式中使用
(?i)
两次。另外,您可以使用
\\w
.FYI代替
a-zA-Z0-9
,没有理由将
(?i)
放在第二个字符串文本中,除非您认为
searchString
可能包含
(?-i)
。搜索例程会将其视为一个大字符串——它不会知道在上面的表达式中它由三个部分组成。因此,第二个
(?i)
是冗余的。此外,如果
searchString
可能包含正则表达式专用的字符,则应将其更改为
Pattern.quote(searchString)
,除非您希望它们是专用的。啊,您需要将字符串文字中的反斜杠加倍。啊,您需要将字符串文字中的反斜杠加倍