给定以下输入字符串 3481.7.1071.html
我想确认一下
最后,我想提取最左边的数字(即3481)。
我目前的正则表达式几乎就在那里,但我无法捕获正确的组:
final Pattern p = Pattern.compile("(\\d++\\.)+html");
final Matcher m = p.matcher("3481.7.1071.html");
if (m.matches()) {
final String corrected = m.group(1)+"html"; // WRONG! Gives 1071.html
}
如何捕获第一场比赛?
答案 0 :(得分:7)
你可以把它考虑出来:
(\d+\.)(\d+\.)*html
答案 1 :(得分:3)
"^(\\d+)\\.(\\d+\\.)*html$"
答案 2 :(得分:0)
Java风格:"(\\d+)\\..*?\\.html$"
这将1)抓住第一组连续数字,2)在单词后需要一个点,3)跳过除了3)文字字符串'.html'之外的所有内容。
如果您的意思是“一个或多个[群组]数字后跟一段时间”,那么这更符合您的要求。
"(\\d+)(?:\\.\\d+)*\\.html$"
这样您就可以得到号而不是点。并且不需要捕获任何其他模式,因此它们不是。
答案 3 :(得分:0)
groovy:000> p = java.util.regex.Pattern.compile("(\\d+).*")
===> (\d+).*
groovy:000> m = p.matcher("3481.7.1071.html")
===> java.util.regex.Matcher[pattern=(\d+).* region=0,16 lastmatch=]
groovy:000> m.find()
===> true
groovy:000> m.group(1)+".html"
===> 3481.html
groovy:000>
答案 4 :(得分:0)
是的,你可以。
如果123.html
和1.23html
且有效,use this:
^(?:(\d+)\.).*?html$
如果123.html
无效但1.23html
有效,use this:
^(?:(\d+)\.(?!h)).*?html$
如果123.html
和1.23html
无效,但只有1.23.html
有效,use this:
^(?:(\d+)\.).*?\.html$
答案 5 :(得分:-1)
jpalecek的解决方案失败了;它捕获最右边的数字。原始海报更接近,但他得到了最右边的号码。要获得最左边的数字,请在第一个点后忽略任何内容:
[^\d]*(\d+)\..*html
[^ \ d] *忽略最左边的数字之前的所有内容(因此X1.html捕获数字1) (\ d +)。捕获第一个数字,如果它们后跟一个点。 。*忽略点和最终html之间的所有内容。