正则表达式匹配“测试”而非“测试-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_.\\-|]*"
您也可以将连字符放在字符类的开头或结尾而不进行转义 – 只是不在中间。