我诚然不是正则表达式专家,但想验证输入字符串并为各种验证编写 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]+)$/
我建议如下:
^[0-9]+:[^:]+:[^:]+
行首,后接数字,后接冒号,后接任意数量的非冒号字符,后接冒号,后接非冒号字符。
这应该是最灵活的以数字开头的冒号分隔格式。
Numbers:(letters OR numbers):(letters OR numbers)
如果您希望它只能是数字或字母用于第二和第三部分,您可以使用以下模式:
String pattern = "^\\d+(:([A-Za-z]+|\\d+)){2}$";
基本上,它会查找一个数字序列 ( \\d+
),然后是一个重复两次的字符序列:
:
,然后是
[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");
}
}
}
这个例子将匹配。
/\d+:\[a-zA-Z0-9]+:\[a-zA-Z0-9]+/
如果你知道你可以做的最大长度
/\d{1,X}:[a-zA-Z0-9]{1,Y}:[a-zA-Z0-9]{1,Z}/
如果您的字符串可能在带引号的字符串中包含冒号,如下所示:
1234:"Ratio is 1:20":"Fuel:Oil"
然后你需要解决字符串中的冒号。基于 Barton Chittenden 的回答,您可以使用:
^(\d+):(".+?"|[^"][^:]*):(".+?"|[^"][^:]*)$
在 regexr 上查看。它会因为一些愚蠢的事情而崩溃123:":"
,但您也可以修改正则表达式来处理这些边缘情况。