下面是我想要捕获的(10-12) <=====这种格式的数据
样本数据:
sdfdsfsdffsd 16.50sd - 57676766.0sd
16.50sd - 57676766.0sd
16.50sd - 57676766.0sd
sdfsdffsdf 6sd - 5.989898989sd sdfsdsdf
sdfdsf 6.50sd - 76.50sd sdfsdfsd
sdfsf sd 12sd - 15sd sdfdsdffsdff
16.50sd - 57sd
16sd - 50sd
1.50sd - 5.0sd
1sd - 5766.34sd the sdfdsfdsf spesdfdsfed
1sd - 5766.34sd the ssdfsdf sdfsdf
这是我到目前为止所拥有的正则表达式
[^\w\.\n]((\s?\-?\s?)(\d*(?=\.)))
结果如下:链接这里https://regex101.com/r/KNvHn8/1
所以
我可以用2正则表达式实现这一点,但更好的需要一个。
谢谢
发布于 2022-07-18 09:29:23
如果您只想要在点之前的第一个数字,并且中间必须有一个连字符,则可以使用两个捕获组:
(\d+)(?:\.\d+)?[^\s\d-]*(\s-\s)[^\d-]*(\d+)
解释
(\d+)
捕获第2组中的1+数字(?:\.\d+)?
可选择匹配.
和1+数字[^\s\d-]*
可选择匹配除空白字符、数字或-(\s-\s)
捕获第2组空白字符之间的-
[^\d-]*
可选择匹配除-
或数字以外的任何字符。(\d+)
捕获第3组中的1+数字如果要在一行上显示结果,可以使用以下三个组替换:
^\D*(\d+)(?:\.\d+)?[^\s\d-]*(\s-\s)[^\d-]*(\d+).*
示例
String regex = "^\\D*(\\d+)(?:\\.\\d+)?[^\\s\\d-]*(\\s-\\s)[^\\d-]*(\\d+).*";
String string = "sdfdsfsdffsd 16.50sd - 57676766.0sd\n"
+ "16.50sd - 57676766.0sd\n"
+ "16.50sd - 57676766.0sd\n"
+ "sdfsdffsdf 6sd - 5.989898989sd sdfsdsdf\n"
+ "sdfdsf 6.50sd - 76.50sd sdfsdfsd\n"
+ "sdfsf sd 12sd - 15sd sdfdsdffsdff\n"
+ "16.50sd - 57sd\n"
+ "16sd - 50sd\n"
+ "1.50sd - 5.0sd\n"
+ "1sd - 5766.34sd the sdfdsfdsf spesdfdsfed\n"
+ "1sd - 5766.34sd the ssdfsdf sdfsdf";
String subst = "$1$2$3";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
System.out.println( matcher.replaceAll("$1$2$3"));
输出
16 - 57676766
16 - 57676766
16 - 57676766
6 - 5
6 - 76
12 - 15
16 - 57
16 - 50
1 - 5
1 - 5766
1 - 5766
https://stackoverflow.com/questions/73019548
复制相似问题