Java 正则表达式不';无法在String.matches()中工作

Java 正则表达式不';无法在String.matches()中工作,java,regex,Java,Regex,我有一小段代码 String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("[a-z]")) { System.out.println(s); } } 应该打印 dkoe 但是它什么也不打印 [a-z]匹配a和z之间的单个字符。例如,如果您的字符串只是“d”,那么它就会匹配并打印出来 您需要将正则表达式更改为[a-z]+以匹配一个或多个字符 您的正

我有一小段代码

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

dkoe

但是它什么也不打印

[a-z]
匹配a和z之间的单个字符。例如,如果您的字符串只是
“d”
,那么它就会匹配并打印出来


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

您的正则表达式
[a-z]
不匹配
dkoe
,因为它只匹配长度为1的字符串。使用类似于
[a-z]+
的方法欢迎使用Java错误命名的
.matches()
方法。。。它尝试并匹配所有输入。不幸的是,其他语言也纷纷效仿:(

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

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

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

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

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

如果您想查找只有小写字符的字符串,请使用模式
[a-z]+


如果要查找至少包含一个小写字符的字符串,请使用模式
*[a-z].
字符串。matches
返回整个字符串是否匹配正则表达式,而不仅仅是任何子字符串。

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

通过执行以下操作,可以使模式不区分大小写:

Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);

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

Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");
以上都失败了

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

上述操作使用了

模式中的模式,您必须在模式中至少放置一个捕获
()
,并按如下方式更正模式:

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

我在网上找到了100多篇不完整的教程。找不到好的。你有什么建议吗?Thanx@fge解释
.matches()
。你可能知道为什么
.find()吗工作慢了吗?你说的是什么意思?从我所知道的,只有C++有一套等价的方法-<代码> RexExxSimule和 ReXExx匹配< /Cord>。在Python中,<代码> Re.Matals>代码>只在字符串的开始锚定匹配(好像它是代码> \APATTLN< /COD>)。Python3.x有一个很好的
.fullmatch()
method。在JS、Go、PHP和.NET中,没有可以隐式锚定匹配的正则表达式方法。默认情况下,ElasticSearch、XML Schema和HTML5/Validators Angluar模式始终锚定。在Swift/Objective C中,有一种方法可以在一开始就用一个选项锚定模式。当你浪费数小时去想到底出了什么问题时,你会有这种感觉你的正则表达式,并在这个答案上结束,所以你意识到你很久以前就已经对它进行了升级…这是真的字符串#matches()默认情况下匹配整个字符串,但是
“123abc”.matches(“^[0-9]+.*$”)
“123abc.matches”([0-9]+.*))
可以工作更多信息这是为什么?!Java的
匹配
在正则表达式的开头放一个“^”,结尾放一个$。因此
匹配(“[a-z]”)实际上会寻找/^[a-z]$/而不是。是的@Robino你绝对正确。当然,如果你希望
匹配
查找任何出现的
[a-z]
,那么它应该匹配所有字符吗?我不希望
matches
根据regex单独检查每个字符。@Robino:在哪里描述/记录了该功能?@Toru在java文档页面上查找String.matches-还有哪里?一个随意的“java String matches documentation”Google在顶部结果中显示短语“str.matches(regex)产生与表达式完全相同的结果”。重要的单词是“justice”。当然它匹配一个字符,这就是regexp所做的!但是什么不清楚(也不应该是这样!)java在所提供的regexp周围加上前缀
^
和后缀
$
,对其进行不自觉的修改并产生奇怪的bug。他们不应该这样做,因为最初的regexp不是这个意思。令人遗憾的是,你是对的。我真的不知道他们为什么这样做。括号中没有ange any.@Touniouk不带括号
匹配项
没有任何输出。