我正在尝试学习正则表达式,但我只对我的第一个代码感到震惊。 我读到,插入符号(^)和美元($)分别用于在测试的开始和结束时进行匹配。但我很难弄清楚我的代码有什么问题。
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String letterA="cat will die";
String pattern="[^cat]";
System.out.println(letterA.matches(pattern));
String pattern1="^(cat)";
System.out.println(letterA.matches(pattern1));
String letterB="Lending your cat";
String pattern3="[cat$]";
System.out.println(letterB.matches(pattern3));
String pattern4="cat$";
System.out.println(letterB.matches(pattern4));
}
}
每个系统都给我输出false
答案 0 :(得分:5)
Caret和dollar是Anchors,只是告诉你的模式是否应该寻找行的开头(Caret)和结束(Dollar)。
此外,在括号内,此语法已更改。如果你以[^ ...]开头,那就意味着一个否定,你试图匹配任何不在插入符号之后的字符。括号内的$只是告诉引擎你正在寻找$ char的匹配。
此外,如果匹配整个字符串,则java中的匹配仅返回true。
记住这些事情,让我们传递你的每个案例,看看他们为什么不匹配:
String letterA="cat will die";
String pattern="[^cat]";
这个正则表达式正在寻找一个不是' c'或者' a'或者' t。像" f"会为这一个回归。
System.out.println(letterA.matches(pattern));
String pattern1="^(cat)";
()是capturing groups,他们在匹配的情况下什么都不做。 ^只是告诉你将在字符串的开头查找匹配,并且你的正则表达式试图匹配字符串" cat"。对于这种情况,这是唯一可能返回true的匹配。
String letterB="Lending your cat";
String pattern3="[cat$]";
这只是试图匹配单个字符串,这些字符串可以是' c'或者' a'或者' t'或者' $'
最后:
String pattern4="cat$";
只是试图匹配正确的字符串' cat' (锚定到最后,但它确实没有什么区别)。
所以,回到你的问题,你需要使用匹配任意数量的字符的。*运算符,如:
^cat.*$
(如果你想要一个以 cat 开头的字符串)^.*cat$
(如果你想要一个以 cat 结尾的字符串)^.*cat.*$
(如果您想要任何包含 cat 文字的字符串)答案 1 :(得分:0)
阅读String.matches
上的文档。表达式必须完全匹配。例如,尝试模式.*cat.*
此外,^
中使用的[]
表示否定,因此[^cat]
读取正则表达式引擎 - “不是c,或a或t”。不确定你是否知道,以防万一...
答案 2 :(得分:0)
实际上,Java matches()
方法匹配整个字符串。因此,使用^
和$
不必要。
您必须使用以下内容:letterA.matches("cat.*")
来匹配与"cat"
策略的字符串。
边界匹配:匹配"字边界" 由"\\b"
示例字符串:" catterpillar将死亡&#34 ;;
letterA.matches("cat.*")
//将返回true
letterA.matches("\\bcat\\b.*")
//将返回false
答案 3 :(得分:0)
这是使用正则表达式进行部分匹配的示例。
import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class HelloWorld{
public static void main(String []args){
Console console = System.console();
String letterA="cat will die";
String spattern=".*cat.*";
System.out.println(letterA.matches(spattern));
Pattern pattern =
Pattern.compile(console.readLine("%nEnter your regex: "));
Matcher matcher =
pattern.matcher(console.readLine("Enter input string to search: "));
System.out.println(matcher.find());
}
}
答案 4 :(得分:0)
根据java docs
public boolean matches()
尝试匹配整个地区 模式。如果匹配成功,则可以通过获得更多信息 开始,结束和分组方法。
返回:
匹配时true
当且仅当整个区域序列与此匹配器模式
现在每个人都已经提到了你的正则表达式中的缺陷。我不会写关于它的。但是,让我对插入符号(^)和美元($)
进行一些分析阅读^ $和^
^
字面匹配,如果该行有行的开头。
`有效说话毫无意义!为什么因为每一行都有一个开头,每行都会匹配 - 甚至是空行!请参阅以下代码
String letterA="";//i'm not writing anything because matches attempt to match entire region
String pattern="^";
System.out.println(letterA.matches(pattern));
它会为您提供输出True
每一行也都有结尾
String letterA="";
String pattern="$";
System.out.println(letterA.matches(pattern));
这也会为您输出true