1

我诚然不是正则表达式专家,但想验证输入字符串并为各种验证编写 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

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

4

5 回答 5

1

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

/^[0-9]+:[0-9a-zA-Z]+:[0-9a-zA-Z]+$/

对于它们只能是字符串或数字的情况:

/^[0-9]+:([0-9]+)|([a-zA-Z]+):([0-9]+)|([a-zA-Z]+)$/
于 2012-04-26T00:17:46.580 回答
1

我建议如下:

 ^[0-9]+:[^:]+:[^:]+

行首,后接数字,后接冒号,后接任意数量的非冒号字符,后接冒号,后接非冒号字符。

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

于 2012-04-26T00:25:46.523 回答
1

匹配Numbers:(letters OR numbers):(letters OR numbers)

如果您希望它只能是数字或字母用于第二和第三部分,您可以使用以下模式:

String pattern = "^\\d+(:([A-Za-z]+|\\d+)){2}$";

基本上,它会查找一个数字序列 ( \\d+),然后是一个重复两次的字符序列:

  • 以 aa 开头:,然后是
    • 一个字母序列(英文),即[A-Za-z], OR
    • 一串数字

和字符是锚点,表示“字符串开头”^$“字符串结尾”

例子:

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");
        }   
    }
}

匹配Numbers:(both letters and numbers:(both letters and numbers)

为此,您可以使用以下模式:

String pattern = "^\\d+(:[A-Za-z0-9]+){2}$";

哪个将匹配:

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

   public class RegexTest {
        public static void Main(String[] args) {
            String pattern = "^\\d+(:[A-Za-z0-9]+){2}$";
            String example = "333:a3b4c:12adf3456";
            if (example.matches(pattern)) {
               System.out.println("Matches");
            }   
        }
    }

这个例子将匹配。

于 2012-04-26T00:36:27.743 回答
0
    /\d+:\[a-zA-Z0-9]+:\[a-zA-Z0-9]+/

如果你知道你可以做的最大长度

    /\d{1,X}:[a-zA-Z0-9]{1,Y}:[a-zA-Z0-9]{1,Z}/
于 2012-04-26T00:19:40.883 回答
0

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

1234:"Ratio is 1:20":"Fuel:Oil"

然后你需要解决字符串中的冒号。基于 Barton Chittenden 的回答,您可以使用:

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

在 regexr 上查看。它会因为一些愚蠢的事情而崩溃123:":",但您也可以修改正则表达式来处理这些边缘情况。

于 2012-04-26T01:29:48.257 回答