我有一个字符串
string 1 (不包括引号) - > “我的车号是# 8746253 ,实际上很酷”
条件 - 编号8746253,可以是任何长度和
- 号码也可以紧跟一个行尾。
我想分组 8746253 ,后面不应该跟一个点“。” 我试过了,
*#(\ d +)[^。]。*
这肯定会得到我的数字,但即使有一个点也会匹配,因为[。^]会匹配数字的最后一位数(例如, 3 以下情况)
string 2 (不包括引号) - > “地球是# 8746253.Kms ,这是非常远的”
我想仅匹配 字符串1 类型,而不是 字符串2 类型。
答案 0 :(得分:5)
要匹配#
之后未跟上点的任意位数,请使用
(?<=#)\d++(?!\.)
++
是一个占有量词,它会使正则表达式引擎仅在最后一个匹配的数字后检查前瞻(?!\.)
,如果之后有一个点,则不会回溯。因此,如果数字块中的最后一位数后面有一个dit,则整个匹配将失败。
请参阅regex demo
匹配整行并将数字放入捕获组#1:
.*#(\d++)(?!\.).*
见this regex demo。或者没有前瞻的版本:
^.*#(\d++)(?:[^.\r\n].*)?$
见another demo。在最后一个版本中,数字块后面只能跟一个可选序列的char不是.
,CR和LF后跟除了换行符之外的任何0+字符((?:[^.\r\n].*)?
)然后是字符串结尾($
)。
答案 1 :(得分:1)
这就像你描述的那样
public class MyRegex{
public static void main(String[] args) {
Pattern patern = Pattern.compile("#(\\d++)[^\\.]");
Matcher matcher1 = patern.matcher("my car number is #8746253 which is actually cool");
if(matcher1.find()){
System.out.println(matcher1.group(1));
}
Matcher matcher2 = patern.matcher("earth is #8746253.Kms away, which is very far");
if(matcher2.find()){
System.out.println(matcher1.group(1));
}else{
System.out.println("No match found");
}
}
}
输出:
> 8746253
> No match found