我需要识别xxx.xxx
等数字。第一个数字是可选的,可以是0
或1
。第二个也是可选的,它可以是0
到9
。第三个应该是0
到9
。
所以我使用像([0|1]?[0-9]?[0-9])\\.\\1
这样的正则表达式。但我看到了意想不到的行为
这是我的代码,
package HelloWorld;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.regex.*;
public class Practice
{
public static void main(String arg[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String sample;
for(int i=0;i<6;i++)
{
sample = br.readLine();
if(Pattern.matches(MyRegex.pattern,sample))
{
System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
}
class MyRegex
{
public static String pattern = "([0|1]?[0-9]?[0-9])\\.\\1";
}
对于输入,
000.12 => false
000.00 => false
000.000 => true
23.23 => trie
提前致谢。
答案 0 :(得分:4)
\\1
命令不重复组内的正则表达式。它只重复您之前捕获的文本。
因此与正则表达式不等同
([0|1]?[0-9]?[0-9])\\.([0|1]?[0-9]?[0-9])
这就是为什么它只允许重复23.23
,因为第二部分等于第一部分。
如果你想重复正则表达式,你需要重新输入它。显式或隐式,如
String part = "([0|1]?[0-9]?[0-9])";
String pattern = part + "\\." + part;
请注意,对于[0|1]
,您可能需要[01]
。 [...]
内的所有内容都已被解释为设置。
如果您使用[0|1]
,则实际上匹配字符0
,1
和字符|
。所以你的模式会匹配像
|13.|13 // Matches
有多个网站可以测试正则表达式,并提供解释,例如 regex101 。这是您的例子regex101/r/f1ytVE。