使用正则表达式验证 "abc=def,123,xyz" 之类的字符串
Validate string like "abc=def,123,xyz" with regex
我想用正则表达式验证输入字段的语法。该字段应接受类似于以下示例的文本:
Something=Item1,Item2,Item3
someOtherThing=Some_Item
必须有一个单词、一个 =
符号和一个逗号分隔的单词列表。该列表必须包含至少一个条目。所以abc=
应该是无效的,但是abc=123
是有效的。
我正在使用一个允许正则表达式 (Java) 将输入字段标记为有效或无效的框架。如何在正则表达式中表达此规则?
借助 ,我能够验证逗号分隔列表。但是一旦我在作业前加上我的东西,正则表达式就不再起作用了:
(\w+)=((?:\w+)+),? // does not work!
我使用了这段代码,但它没有使用任何正则表达式。代码:
import java.util.*;
public class MyClass {
public static void main(String[] args) {
String something1 = "Something=Item1,Item2,Item3";
String something2 = "Something=";
String something3 = "Something";
String something4 = "=Item1,Item2,Item3";
System.out.println(isValid(something1));
System.out.println(isValid(something2));
System.out.println(isValid(something3));
System.out.println(isValid(something4));
}
public static boolean isValid(String string) {
boolean checkPart1Correct = string.contains("="); // check if it has = sign
if(!checkPart1Correct) return false;
//now we will split and see it it has items and the text before the = sign is not empty
String[] partsOfString = string.split("=");
if(partsOfString[0].trim().isEmpty()) return false;
try {
if(partsOfString[1] == null) return false;
}catch(Exception e) {
return false;
}
if(partsOfString[1] == null) return false;
String[] items = partsOfString[1].split(",");
if(items.length == 0) return false;
//now, we will make the items into a list, and then you can do whatever you want
List<String> itemsList = Arrays.asList(items);
//you can do whatever you want with that list
return true;
}
}
测试后 here,您可以看到它的实际效果。此外,这些是在此代码中完成的检查:
- 它将检查 = 符号之前的文本是否不为空。
- 它将检查是否有 = 符号。
- 它将检查项目是否为空
- 它还会为我们提供该列表中的项目列表。
试试这个正则表达式:
\w+=\w+(,\w+)*
在Java中这样使用:
if (input.matches("\w+=\w+(,\w+)*")) {
// input is OK
}
如果第一部分不应该有数字,请改用:
[a-zA-Z_]+=\w+(,\w+)*
或者如果只是第一个字符不应该是数字(即它应该是一个有效的 Java 变量名),使用这个:
[a-zA-Z_]\w*=\w+(,\w+)*
您没有在组中重复逗号,这就是它在有多个逗号分隔值时不起作用的原因。
如果您想要单独匹配键和值,您可以使用 \G
锚点。
(?:^(\w+)=|\G(?!^))(\w+)(?:,|$)
说明
(?:
非捕获组
^(\w+)=
断言字符串开始并捕获第 1 组中的 1+ 个单词字符
|
或
\G(?!^)
在上一场比赛结束时声明位置,而不是在开始时
)
关闭非捕获组
(\w+)
捕获组2,匹配1+个单词字符
(?:,|$)
匹配 ,
或断言字符串结尾
例如:
String regex = "(?:^(\w+)=|\G(?!^))(\w+)(?:,|$)";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
String[] strings = {"Something=Item1,Item2,Item3", "someOtherThing=Some_Item", "Something="};
for (String s : strings) {
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
String gr1 = matcher.group(1);
String gr2 = matcher.group(2);
if (gr1 != null) {
System.out.println("Group 1: " + gr1);
}
if (gr2 != null) {
System.out.println("Group 2: " + gr2);
}
}
}
输出
Group 1: Something
Group 2: Item1
Group 2: Item2
Group 2: Item3
Group 1: someOtherThing
Group 2: Some_Item
我想用正则表达式验证输入字段的语法。该字段应接受类似于以下示例的文本:
Something=Item1,Item2,Item3
someOtherThing=Some_Item
必须有一个单词、一个 =
符号和一个逗号分隔的单词列表。该列表必须包含至少一个条目。所以abc=
应该是无效的,但是abc=123
是有效的。
我正在使用一个允许正则表达式 (Java) 将输入字段标记为有效或无效的框架。如何在正则表达式中表达此规则?
借助
(\w+)=((?:\w+)+),? // does not work!
我使用了这段代码,但它没有使用任何正则表达式。代码:
import java.util.*;
public class MyClass {
public static void main(String[] args) {
String something1 = "Something=Item1,Item2,Item3";
String something2 = "Something=";
String something3 = "Something";
String something4 = "=Item1,Item2,Item3";
System.out.println(isValid(something1));
System.out.println(isValid(something2));
System.out.println(isValid(something3));
System.out.println(isValid(something4));
}
public static boolean isValid(String string) {
boolean checkPart1Correct = string.contains("="); // check if it has = sign
if(!checkPart1Correct) return false;
//now we will split and see it it has items and the text before the = sign is not empty
String[] partsOfString = string.split("=");
if(partsOfString[0].trim().isEmpty()) return false;
try {
if(partsOfString[1] == null) return false;
}catch(Exception e) {
return false;
}
if(partsOfString[1] == null) return false;
String[] items = partsOfString[1].split(",");
if(items.length == 0) return false;
//now, we will make the items into a list, and then you can do whatever you want
List<String> itemsList = Arrays.asList(items);
//you can do whatever you want with that list
return true;
}
}
测试后 here,您可以看到它的实际效果。此外,这些是在此代码中完成的检查:
- 它将检查 = 符号之前的文本是否不为空。
- 它将检查是否有 = 符号。
- 它将检查项目是否为空
- 它还会为我们提供该列表中的项目列表。
试试这个正则表达式:
\w+=\w+(,\w+)*
在Java中这样使用:
if (input.matches("\w+=\w+(,\w+)*")) {
// input is OK
}
如果第一部分不应该有数字,请改用:
[a-zA-Z_]+=\w+(,\w+)*
或者如果只是第一个字符不应该是数字(即它应该是一个有效的 Java 变量名),使用这个:
[a-zA-Z_]\w*=\w+(,\w+)*
您没有在组中重复逗号,这就是它在有多个逗号分隔值时不起作用的原因。
如果您想要单独匹配键和值,您可以使用 \G
锚点。
(?:^(\w+)=|\G(?!^))(\w+)(?:,|$)
说明
(?:
非捕获组^(\w+)=
断言字符串开始并捕获第 1 组中的 1+ 个单词字符|
或\G(?!^)
在上一场比赛结束时声明位置,而不是在开始时
)
关闭非捕获组(\w+)
捕获组2,匹配1+个单词字符(?:,|$)
匹配,
或断言字符串结尾
例如:
String regex = "(?:^(\w+)=|\G(?!^))(\w+)(?:,|$)";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
String[] strings = {"Something=Item1,Item2,Item3", "someOtherThing=Some_Item", "Something="};
for (String s : strings) {
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
String gr1 = matcher.group(1);
String gr2 = matcher.group(2);
if (gr1 != null) {
System.out.println("Group 1: " + gr1);
}
if (gr2 != null) {
System.out.println("Group 2: " + gr2);
}
}
}
输出
Group 1: Something
Group 2: Item1
Group 2: Item2
Group 2: Item3
Group 1: someOtherThing
Group 2: Some_Item