我最近开始在Java中使用正则表达式,但我遇到了一个奇怪的表达。
问题要求找到仅由字母组成的“单词”,最多只有一个结束时期。 例如,如果我输入字符串:
one two. wr7ng not1 three. nope..
引擎会找到一个,两个和三个作为匹配的单词。问题的解决方案是这个模式:
for (String tok : s.split(" ")) {
if (tok.matches("[a-zA-Z]+//.?")) {
// code done to record successful match
}
}
这两个正斜杠是什么意思?我将这个表达式与这个表达式进行了比较:
[a-zA-Z]+.?
发现只有后者错误地接受了最后一个时段(句号)中的数字。这是唯一的区别吗?
答案 0 :(得分:5)
你确定它不是反斜杠吗?
"[a-zA-Z]+\\.?"
文字字符串中的两个反斜杠被解释为“在文字字符串中插入单个反斜杠”。 (作为惯例,在许多语言中,反斜杠anychar意味着“插入anychar”)。
当文字字符串被解释为正则表达式时, 实际文本
\.
表示“将'句号'作为文字字符匹配”。
如果您没有反斜杠“转义字符”,则大多数Regexp引擎意味着“匹配任何字符”。
答案 1 :(得分:2)
看起来你有一个错字。它应该是"[a-zA-Z]+\\."
。
该字符串值成为正则表达式值[a-zA-Z]+\.
。反斜杠表示应将.
视为文字句点。没有它,.
是一个特殊的正则表达式元字符,匹配任何单个字符(包括数字)。
答案 2 :(得分:2)
确切的RE是:
[a-zA-Z]+\.?
并使用Java编译它,你需要一个反斜杠\,这意味着Java字符串中的转义字符:
"[a-zA-Z]+\\.?"
答案 3 :(得分:1)
正斜杠在正则表达式中没有特殊含义,因此“//”表示匹配两个正斜杠。
如果这没有意义,这可能是一个错字,或者你误读或错误地转录了正则表达式。用反斜杠替换正斜杠的明显“修正”给出了:
tok.matches("[a-zA-Z]+\\.?")
表示“匹配罗马字母后跟可选的'.'
”。在上下文中,可以表示英文单词,后跟fullstop / period。
对于记录,"[a-zA-Z]+.?"
匹配一个或多个罗马字母,后跟(可选)一个字符。 +
运算符的“急切”意味着可选字符将是非字母......如果有的话。
答案 4 :(得分:1)
使用.
(点)将被解释为正则表达式字符,表示“任何字符”。
使用\.
会产生编译错误。非法逃脱角色
使用\\.
将被解释为一个简单的.
(点)字符,这是您需要使用的字符。
因此,对于仅包含字母的单词,您使用[a-zA-Z]+
,其中+
(加号)是一个量词,表示“一个或多个”。
对于单个.
(点)字符,您使用\\.
。
现在,对于.
(点)字符的“最近一次”部分,您将使用?
量词,这意味着“一个或多个”。您对.
部分的表达式变为\\.?
。
因此,您的正则表达式将为[a-zA-Z]+\\.?
。