gpt4 book ai didi

java - 检查字符串是否满足正则表达式

转载 作者:行者123 更新时间:2023-11-29 07:27:23 25 4
gpt4 key购买 nike

我有一个字符串列表,我想过滤掉与正则表达式模式不匹配的字符串

输入列表 = Orthopedic,Orthopedic/Ortho,Length(in.)

我的代码

for(String s : keyList){
Pattern p = Pattern.compile("[a-zA-Z0-9-_]");
Matcher m = p.matcher(s);
if (!m.find()){
System.out.println(s);
}
}

我希望打印第二个和第三个字符串,因为它们与正则表达式不匹配。但它没有打印任何东西

最佳答案

解释

您没有匹配整个输入。相反,您正试图在输入中找到下一个匹配部分。从 Matcher#finds documentation :

Attempts to find the next subsequence of the input sequence that matches the pattern.

因此,如果至少一个字符是a-zA-Z0-9-_之一,您的代码将匹配输入。


解决方案

如果你想匹配整个区域,你应该使用 Matcher#matches ( documentation ):

Attempts to match the entire region against the pattern.

你可能想调整你的模式以允许多个字符,例如像这样的模式

[a-zA-Z0-9-_]+

+ 允许 1 无限多次重复模式(?0 1*0 到无穷大)。


注意事项

您在模式末尾有一个额外的 -。你可能想删除它。或者,如果您打算随意匹配字符,则需要对其进行转义:

[a-zA-Z0-9\\-_]+

您可以在 regex101.com 等网站上测试您的正则表达式,这是您的模式:regex101.com/r/xvT8V0/1 .

请注意,还有 String#matches ( documentation )。因此,您可以仅使用 s.matches("[a-zA-Z0-9_]+") 编写更紧凑的代码。

另请注意,您可以通过使用 predefined sets 来简化字符集,例如 [a-zA-Z0-9_] .集合 \w(单词字符)与您想要的模式完全匹配。

由于模式和匹配器都没有改变,您可能希望将它们移到循环之外以稍微提高性能。


代码

总而言之,您的代码可能如下所示:

Pattern p = Pattern.compile("[a-zA-Z0-9_]+");
Matcher m = p.matcher(s);

for (String s : keyList) {
if (!m.matches()) {
System.out.println(s);
}
}

或紧凑型:

for (String s : keyList) {
if (!s.matches("\\w")) {
System.out.println(s);
}
}

使用流:

keyList.stream()
.filter(s -> !s.matches("\\w"))
.forEach(System.out::println);

关于java - 检查字符串是否满足正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49199906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com