使用正则表达式验证 "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,您可以看到它的实际效果。此外,这些是在此代码中完成的检查:

  1. 它将检查 = 符号之前的文本是否不为空。
  2. 它将检查是否有 = 符号。
  3. 它将检查项目是否为空
  4. 它还会为我们提供该列表中的项目列表。

试试这个正则表达式:

\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+个单词字符
  • (?:,|$) 匹配 , 或断言字符串结尾

Regex demo | Java demo

例如:

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