4 回答

TA貢獻1821條經驗 獲得超5個贊
示例中有很多模式可以用來設計表達式。例如,我們可以從這個表達式開始:
^[^-]+-[^-]+-[^_]+_([0-9]+\.){3}[0-9]+$
表達式在這個演示的右上角面板上有解釋,如果你想探索/簡化/修改它,并且在這個鏈接中,如果你愿意,你可以觀看它如何逐步匹配一些示例輸入。
測試
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "^[^-]+-[^-]+-[^_]+_([0-9]+\\.){3}[0-9]+$";
final String string = "DYYU-tx-6.7.9.7_6.1.1.0\n"
+ "DYYU-tx-6.7.9.7_60.11.11.09\n"
+ "DYYU-tx-60.70.90.70_6.1.1.0";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
正則表達式電路
jex.im可視化正則表達式:

TA貢獻1865條經驗 獲得超7個贊
您的模式不匹配,因為您使用.*
which 將首先匹配直到字符串末尾。然后你匹配一個_
所以它回溯到最后一個下劃線并嘗試匹配模式的其余部分。
因為有 1 個下劃線,所以你想匹配它后面的連字符,但是下劃線后面沒有連字符可以匹配,所以沒有匹配。
另一種編寫它的方法可能是使用否定字符類 [^-]
匹配而不是連字符而不是使用.*
^[^-]+-[^-]+-\d+(?:\.\d+){3}_\d+(?:\.\d+){3} $
解釋
^
字符串的開始[^-]+-
匹配 1+ 次除以下以外的任何字符-
[^-]+-
同上\d+(?:\.\d+){3}
數學 1+ 數字,重復 3 次匹配 a.
和 1+ 數字_
匹配下劃線\d+(?:\.\d+){3}
數學 1+ 數字,重復 3 次匹配 a.
和 1+ 數字[ ]$
匹配一個空格(為清楚起見在括號之間表示)并斷言字符串結尾
在爪哇
String regex = "^[^-]+-[^-]+-\\d+(?:\\.\\d+){3}_\\d+(?:\\.\\d+){3} $";
請注意,在您的示例數據中,字符串以空格結尾,因此之前有一個空格$

TA貢獻1797條經驗 獲得超6個贊
DYYU-tx-(?>\d+[._]?){8}
搜索文字 DYYU-tx-
尋找 1 個或多個后面可能跟有 a
.
或_
8 次的數字。
我假設它總是以 DYYU-tx- 開頭,并且它總是 4 個數字,用句點分隔,后跟一個下劃線,然后再有 4 個數字,用句點分隔。
添加回答
舉報