我正在读取一个 Java 应用程序的文件,该文件的数据由以下格式的冒号分隔:test : test : 0 : 0其中前两段是某物的名称,后两段是数字。如果输入的格式不是上面那样的格式(除了数据不同),匹配应该失败test : test : 0 : 0 -----> pass: test: 0 : 0 -----> fail0 : test : 0 : test -----> failtest test : 0 : 0 -----> fail因此,如果省略了任何段,则匹配将失败,如果数字和单词没有出现在它们应该出现的位置,即word : word : digit : digit,必须有 3 个冒号和 4 个段,不能超过以上。这是我到目前为止所取得的进展,但并不完全正确:^\D+(?:\s\:\s\w+)*$
3 回答
FFIVE
TA贡献1797条经验 获得超6个赞
你可以使用像这样的正则表达式
^[a-zA-Z]+\s*:\s*[a-zA-Z]+(?:\s*:\s*\d+){2}$
细节
^
- 字符串的开始(隐含在String#matches
)[a-zA-Z]+
- 1+ 个 ASCII 字母\s*:\s*
-:
用 0+ 个空格包围[a-zA-Z]+
- 1+ 个 ASCII 字母(?:\s*:\s*\d+){2}
- 两次出现:
用 0+ 空格和 1+ 数字括起来$
- 字符串结尾(隐含在String#matches
)
注意:如果项目之间必须有一个强制性的单个空格,则需要替换\s*
为\s
。要匹配 1 个或多个空格,\s*
必须转换为\s+
.
在 Java 中,你可以把它写成
s.matches("[a-zA-Z]+\\s*:\\s*[a-zA-Z]+(?:\\s*:\\s*\\d+){2}")
查看正则表达式演示
扬帆大鱼
TA贡献1799条经验 获得超9个赞
我只会String#matches在每一行上使用,使用以下模式:
[a-z]+ : [a-z]+ : [0-9]+ : [0-9]+
例如:
String line = "test : test : 0 : 0";
if (line.matches("[a-z]+ : [a-z]+ : [0-9]+ : [0-9]+")) {
System.out.println("Found a match");
}
添加回答
举报
0/150
提交
取消