您好我有关于RegEx的问题。我目前正试图找到一种方法来获取任何字母后跟任意两个数字的子字符串,例如:d09。
我提出了RegEx ^[a-z]{1}[0-9]{2}$
并在字符串
sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0
但是,它从未找到r30,下面的代码显示了我在Java中的方法。
Pattern pattern = Pattern.compile("^[a-z]{1}[0-9]{2}$");
Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0");
if(matcher.matches())
System.out.println(matcher.group(1));
它永远不会输出任何东西,因为matcher永远不会找到子串(当我通过调试器运行它时),我做错了什么?
答案 0 :(得分:6)
有三个错误:
您的表达式包含anchors。 ^
仅匹配字符串的开头,$
仅匹配结尾。因此,您的正则表达式将与"r30"
匹配,但不会与"foo_r30_bar"
匹配。您正在搜索子字符串,因此您应该删除锚点。
matches
应为find
。
您没有组1,因为正则表达式中没有括号。使用group()
代替group(1)
。
试试这个:
Pattern pattern = Pattern.compile("[a-z][0-9]{2}");
Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0");
if(matcher.find()) {
System.out.println(matcher.group());
}
通过调用模式的匹配器方法从模式创建匹配器。创建后,匹配器可用于执行三种不同的匹配操作:
- matches方法尝试将整个输入序列与模式匹配。
- lookupAt方法尝试将输入序列(从头开始)与模式匹配。
- find方法扫描输入序列,寻找与模式匹配的下一个子序列。
答案 1 :(得分:2)
它不匹配,因为^
和$
分隔字符串的开头和结尾。如果你想要它在任何地方,删除它,你会成功。
答案 2 :(得分:1)
您的正则表达式已锚定,因此除非整个输入与您的正则表达式匹配,否则它将永远不会匹配。使用[a-z][0-9]{2}
。
请勿使用.matches()
,但.find()
:.matches()
被错误地命名并尝试匹配整个输入。
答案 3 :(得分:0)
"[a-z][0-9][0-9]"
怎么样?那应该找到你正在寻找的所有子串。
答案 4 :(得分:0)
^ [A-Z] {1} [0-9] {2} $
sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0
据我所知,
也许如果我有关于你的字符串的更多数据我可以提供帮助
修改强>
如果您确定*点数,那么
更改此行
Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0");
到
Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0".split("\.")[0]);
请注意: -
使用我的解决方案,你应该省略前导^ for pattern
的此页面