正则表达式在String.matches()中不起作用

Joh*_*ohn 129 java regex

我有这段小代码

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("[a-z]"))
    {
        System.out.println(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

打算打印

dkoe
Run Code Online (Sandbox Code Playgroud)

但它什么都没打印!!

fge*_*fge 302

欢迎使用Java的错误名称.matches()方法...它尝试并匹配所有输入.不幸的是,其他语言也纷纷效仿:(

如果要查看正则表达式是否与输入文本匹配,请使用a Pattern,a Matcher.find()匹配器的方法:

Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
    // match
Run Code Online (Sandbox Code Playgroud)

如果你想要的确是看输入只有小写字母,你可以使用.matches(),但你需要匹配一个或多个字符:将a附加+到你的角色类,如[a-z]+.或者使用^[a-z]+$.find().

  • *其他语言跟风*是什么意思?据我所知,只有C ++具有一组等效的方法-`regex_search`和`regex_match`。在Python中,`re.match`仅将匹配项锚定在字符串的开头(就像它是\ Apattern一样),而Python 3.x有一个不错的.fullmatch()方法。在JS,Go,PHP和.NET中,没有用于隐式锚定匹配的regex方法。ElasticSearch,XML Schema和HTML5 / Validators Angluar模式始终默认锚定。在Swift / Objective C中,有一种方法可以使用选项在开始时锚定模式。 (3认同)
  • 我在网上找到了100多个不完整的教程.找不到好的.你有什么建议吗? (2认同)
  • 当你浪费几个小时想知道你的正则表达式有什么问题并最终得到这个答案时意识到你很久以前就已经投票了,这种感觉...... (2认同)
  • 默认情况下,String#matches() 确实匹配整个字符串,但 `"123abc".matches("^[0-9]+.*$")` 或 `"123abc".matches("[0-9] +.*")` 也有效 (2认同)

dog*_*ane 40

[a-z]匹配a 和z之间的单个 char.因此,如果您的字符串只是"d",例如,那么它将匹配并打印出来.

您需要将正则表达式更改[a-z]+为匹配一个或多个字符.

  • 当然它匹配一个char,这就是regexp所做的!但是不清楚(也不应该是这种情况!)是java在提供的正则表达式周围放置前缀`^`和后缀`$`,不必要地改变它并创建奇怪的错误.他们不应该这样做,因为这不是最初的正则表达式的意思. (11认同)

ysh*_*vit 22

String.matches返回整个字符串是否与正则表达式匹配,而不仅仅是任何子字符串.

  • 确实令人难过的事实是你是对的。我真的不知道他们为什么这样做。 (2认同)

Hac*_*chi 16

java的正则表达式的实现尝试匹配整个字符串

这与试图找到匹配部分的perl正则表达式不同

如果要查找只包含小写字符的字符串,请使用该模式 [a-z]+

如果要查找包含至少一个小写字符的字符串,请使用该模式 .*[a-z].*

  • 为什么这[未记录](https://docs.oracle.com/javase/10/docs/api/java/lang/String.html#matches(java.lang.String))?! (2认同)

Bon*_*oni 9

用过的

String[] words = {"{apf","hum_","dkoe","12f"};
    for(String s:words)
    {
        if(s.matches("[a-z]+"))
        {
            System.out.println(s);
        }
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

我曾经遇到过同样的问题:

Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");
Run Code Online (Sandbox Code Playgroud)

以上失败!

Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");
Run Code Online (Sandbox Code Playgroud)

以上适用于(and内的模式)