Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冒号分隔值正则表达式验证_Java_Regex - Fatal编程技术网

Java 冒号分隔值正则表达式验证

Java 冒号分隔值正则表达式验证,java,regex,Java,Regex,诚然,我不是正则表达式专家,但我想验证输入字符串,为各种验证编写if/else语句并不是实现这一点的方法。我正在使用Java 输入将采用冒号(:)分隔的三个值的元组形式。第一个值将是一个整数(就大小/长度而言可能是一个长值),另外两个值是数字或字符串 例如,以下值将是有效的: 1:x:456 2:2:3 3:abc:123 …而这些不会: x:1:2 1:2 1:3::x 1:2 fyz::2:1 1:3::3 是否有一种相对简单的方法可以使用正则表达式验证此输入?对于第二个和第三个值可

诚然,我不是正则表达式专家,但我想验证输入字符串,为各种验证编写if/else语句并不是实现这一点的方法。我正在使用Java

输入将采用冒号(:)分隔的三个值的元组形式。第一个值将是一个整数(就大小/长度而言可能是一个长值),另外两个值是数字或字符串

例如,以下值将是有效的:

  • 1:x:456
  • 2:2:3
  • 3:abc:123
…而这些不会:

  • x:1:2
  • 1:2
  • 1:3::x
  • 1:2
  • fyz::2:1
  • 1:3::3

是否有一种相对简单的方法可以使用正则表达式验证此输入?

对于第二个和第三个值可以混合的情况:

/^[0-9]+:[0-9a-zA-Z]+:[0-9a-zA-Z]+$/
对于只能是字符串或数字的情况:

/^[0-9]+:([0-9]+)|([a-zA-Z]+):([0-9]+)|([a-zA-Z]+)$/
如果你知道你能做的最大长度

    /\d{1,X}:[a-zA-Z0-9]{1,Y}:[a-zA-Z0-9]{1,Z}/

我建议如下:

 ^[0-9]+:[^:]+:[^:]+
行首,后跟数字,后跟冒号,后跟任意数量的非冒号字符,后跟冒号,后跟非冒号字符

这应该是以数字开头的最灵活的冒号分隔格式。

匹配
数字:(字母或数字):(字母或数字)
如果您希望第二部分和第三部分只能使用数字或字母,可以使用以下模式:

String pattern = "^\\d+(:([A-Za-z]+|\\d+)){2}$";
String pattern = "^\\d+(:[A-Za-z0-9]+){2}$";
基本上,它将查找一个数字序列(
\\d+
),然后是一个重复两次的字符序列:

  • 以a开头:,后跟
    • 字母序列(英文),即
      [a-Za-z]
      ,或
    • 数列
^
$
字符是锚定符,表示“字符串开始”和“字符串结束”

例如:

public class RegexTest {
    public static void Main(String[] args) {
        String pattern = "^\\d+(:([A-Za-z]+|\\d+)){2}$";
        String example = "333:abc:123456";
        if (example.matches(pattern)) {
           System.out.println("Matches");
        }   
    }
}
匹配<代码>数字:(字母和数字都匹配)(字母和数字都匹配) 为此,您可以使用以下模式:

String pattern = "^\\d+(:([A-Za-z]+|\\d+)){2}$";
String pattern = "^\\d+(:[A-Za-z0-9]+){2}$";
哪一个匹配:

  • 一系列数字,后跟
  • 冒号,后跟字母或数字的任意组合
    • 重复这个序列两次


此示例将匹配。

如果您的字符串可能在带引号的字符串中包含冒号,如下所示:

1234:"Ratio is 1:20":"Fuel:Oil"
然后你需要绕过字符串中的冒号。基于Barton Chittenden的答案,你可以使用以下方法:

^(\d+):(".+?"|[^"][^:]*):(".+?"|[^"][^:]*)$

。它会因为一些愚蠢的事情而崩溃,例如:“”,但您也可以修改正则表达式来处理这些边缘情况。

对于第二部分和第三部分,它们是文本还是数字?也就是说,没有混合。两者都可以。完全独立。冒号分隔符可以用作字符串中的文字吗?例如:
42:“燃油与机油的比例为30:1”:xyz
?不,没有引号,没有空格。