读取Java应用程序文件,该文件的数据用冒号分隔,格式为:
test : test : 0 : 0
其中前两个段是某物的名称,后两个段是数字 如果输入的格式没有按照上面的确切方式(除了数据不同),匹配将失败。
test : test : 0 : 0 ---->pass
: test: 0 : 0 -----> fail
0 : test : 0 : test -----> fail
test test : 0 : 0 -----> fail
因此,如果省略了任何段,如果数字和单词没有出现在应有的位置,即单词:word:digit:digit,并且数字必须不超过3个冒号和4个段,则匹配将失败
这是我到目前为止所到之处,但完全正确:
^\D+(?:\s\:\s\w+)*$
非常感谢您的帮助!
答案 0 :(得分:1)
您可以使用正则表达式,例如
^[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}")
请参见regex demo
答案 1 :(得分:0)
我只会在每行上使用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");
}
答案 2 :(得分:0)
您在这里(演示在Regex101上):
encoded.toDF().show(5, false)
+-----+
|value|
+-----+
|0 |
|0 |
|0 |
|0 |
|0 |
+-----+
说明:
[a-zA-Z]+\s+:\s+[a-zA-Z]+\s+:\s+\d+\s+:\s+\d+
代表1个或多个字母([a-zA-Z]+
是允许至少一次匹配上一个语句的修饰符+
代表1个或更多\s+
从字面上是:
字符:
至少代表一位数字(删除\d+
以精确匹配一位数字)最后,根据需要组成这些部分。您可能希望使Regex更加严格,只用一个空白+
代替\s+
。
使用方法String::matches
验证字符串(不要忘记使用两个斜杠)
\\