3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以使用
-?(?<!\d)(?<!\d\.)\d*\.?\d+(?!\.?\d)
如果不需要匹配-
前面的可選項(xiàng),則將其刪除即可。
請(qǐng)參閱正則表達(dá)式演示
細(xì)節(jié)
-?
- 可選的連字符(?<!\d)(?<!\d\.)
- 緊靠左邊,不應(yīng)有數(shù)字或數(shù)字 +.
\d*
- 0+ 位數(shù)字\.?
- 一個(gè)可選的點(diǎn)\d+
- 1+ 位數(shù)字(?!\.?\d)
- 緊靠右邊,不能有數(shù)字或.
+數(shù)字。
在 Java 中,使用:
Pattern pattern = Pattern.compile("-?(?<!\\d)(?<!\\d\\.)\\d*\\.?\\d+(?!\\.?\\d)");

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
我無(wú)法閱讀這些正則表達(dá)式,它們對(duì)于普通人來(lái)說(shuō)太復(fù)雜了。
為什么要使用復(fù)雜的正則表達(dá)式,其他開(kāi)發(fā)人員很難閱讀。如果我必須調(diào)試該代碼,我會(huì)討厭它。
我覺(jué)得像下面這樣的東西會(huì)更具可讀性,并且也會(huì)減少錯(cuò)誤的機(jī)會(huì),并且易于調(diào)試:
public double sumFile(String filename) {
try (Stream<String> linesStream = Files.lines(Paths.get(filename))) {
return linesStream.mapToDouble(this::sumLine).sum();
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
private double sumLine(String line) {
return Arrays.stream(line.split(","))
.filter(e -> e.split("\\.").length <= 2)
.mapToDouble(Double::parseDouble)
.sum();
}

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊
錯(cuò)誤數(shù)字的子串實(shí)際上有效的問(wèn)題。“1.2.3”應(yīng)該被忽略,但如果您只是盲目地尋找有效數(shù)字,那么這個(gè)數(shù)字可能包含“1.2”或“2.3”作為有效數(shù)字。
有兩種方法可以避免這種情況:
用已知的分隔符“,”分割該行,并驗(yàn)證每個(gè)部分是否有效或
搜索有效和無(wú)效的號(hào)碼并丟棄無(wú)效的號(hào)碼。
為此,您可以使用正則表達(dá)式
-?\d+\.?\d*(\.d*)?
,并在匹配組非空時(shí)丟棄結(jié)果。
添加回答
舉報(bào)