使用正则表达式验证冒号分隔的输入

时间:2018-09-27 10:16:10

标签: java regex

读取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+)*$

非常感谢您的帮助!

3 个答案:

答案 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验证字符串(不要忘记使用两个斜杠

\\