Java中RegEx(正则表达式)的等价于SQL LIKE语句的“%A%B%”是什么?

6

Java中与SQL LIKE子句“%A%B%”等效的正则表达式是什么?

这是一个相当基础的问题,我正在学习Java的正则表达式。

3个回答

11

我认为这是匹配模式:.*A.*B.*

我会编辑并添加更多特定于Java调用的信息。

编辑 #1:

//simplest match
"".matches( ".*A.*B.*" );

String foo = "";
foo.matches( ".*A.*B.*" );

编辑 #2: 从API文档中:

Pattern p = Pattern.compile(".*A.*B.*");
Matcher m = p.matcher("your-string-here");
boolean b = m.matches();

另外,我建议看一下RegexBuddy,它并非免费软件,但它可以生成许多语言的代码片段、测试和解析正则表达式等功能。


@javamonkey79:你不需要使用问号使其变成非贪婪模式吗? - thejh
我不确定。我的理解是SQL LIKE语句是“任意字符,然后是A,然后是任意字符,然后是B,最后是任意字符”。如果您有关于非贪婪模式的好解释,我很乐意阅读并点赞 :) - javamonkey79
@javamonkey79: .* 的意思是“取到末尾的每个字符”。当你写 .*A 时,它的意思是“取到末尾的每个字符,然后查找一个 A”。由于你已经使用 .* 贪婪地匹配了所有内容,没有留下任何 A,所以该模式在例如 “A” 上不匹配。 - thejh
@thejh:抱歉没有格式化:这对我来说是正确的:String regex = ".*A"; System.out.println("A".matches(regex)); - javamonkey79
2
@thejh - 不对。.*A会匹配"A",因为正则表达式引擎会在.*匹配“太多”时回溯。贪婪和非贪婪的区别只有在使用括号捕获匹配项时才会发挥作用。 - John Kugelman

0

这是 ".?A.?B." 如果你使用 . 而不带 ?, 它会匹配整个字符串,因为 . (点) 表示 "任何字符",* 表示 0 到无限次。


我曾以为在Java中'.?'只能匹配一次或根本不匹配。难道thejh更正确吗? - javamonkey79

0
Pattern p = Pattern.compile(".*?A.*?B.*");
Matcher m = p.matcher(str);
if (m.matches()) {
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接