正则表达式不适用于String.matches()


147

我有这小段代码

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

应该打印

dkoe

但是它什么也没打印!


41
Java matches为您在正则表达式的开头加一个^,在结尾加一个$。因此,matches("[a-z]")实际上将查找/ ^ [az] $ /。
罗宾诺

是的@Robino,您绝对正确。
米希尔(Mihir)'18

1
当然,如果您希望matches寻找的任何出现[a-z],那么它应该与它们全部匹配吗?我不希望matches针对正则表达式单独检查每个字符。
PhilHibbs

@Robino:在哪里描述/记录了该功能?
托鲁

@Toru在String.Matches的Java文档页面上-还有其他地方?随意的Google“ java字符串匹配文档”显示在顶部结果中,短语“ str.matches(regex)产生与表达式完全相同的结果”。重要的词是“完全”。
Robino

Answers:


323

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

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

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

如果确实要查看输入是否仅包含小写字母,可以使用.matches(),但需要匹配一个或多个字符:将a附加+到字符类中,如[a-z]+。或使用^[a-z]+$.find()


2
我在网上发现了数百本不完整的教程。找不到好的。你有什么建议吗?
约翰

感谢@fge进行解释.matches()。也许您知道.find()此示例中为什么工作如此缓慢?
Konstantin Konopko 2013年

3
您所说的其他跟风语言是什么意思?据我所知,只有C ++具有一组等效的方法- regex_searchregex_match。在Python中,re.match仅将匹配项锚定在字符串的开头(就好像是\Apattern),而Python 3.x有一个不错的.fullmatch()方法。在JS,Go,PHP和.NET中,没有用于隐式锚定匹配的regex方法。ElasticSearch,XML Schema和HTML5 / Validators Angluar模式始终默认锚定。在Swift / Objective C中,有一种方法可以使用选项在开始时锚定模式。
WiktorStribiżew17年

有没有一个单一的方式来做到这一点?
红衣主教-恢复莫妮卡

44

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

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


12
当然,它只匹配一个字符,这就是regexp的作用!但是还不清楚(也不应该是这种情况!)是java 在提供的regexp周围加上前缀^和后缀$,从而不必要地对其进行了更改并产生了怪异的bug。他们不应该这样做,因为这不是最初的regexp的意思。
klaar

28

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


3
确实令人难过的事实是你是对的。我真的不知道他们为什么这样做。
Hola Soy Edu Feliz Navidad

16

Java的regexes实现尝试匹配整个字符串

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

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

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



3
为什么没有记录
Leo Orientis

12

用过的

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

4

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

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

上面失败了!

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

在以上范围内的工作模式()


2

您的正则表达式[a-z]不匹配,dkoe因为它仅匹配长度为1的字符串。请使用[a-z]+


-1

您必须在模式中至少放置一个捕获()以进行匹配,并像这样纠正模式:

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

括号没有任何改变。
Touniouk '19

没有括号的@Touniouk没有matches任何输出。
MohsenB

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.