当前位置: 首页 > 知识库问答 >
问题:

使用正则表达式验证字符串,例如“abc=def,123, xyz”

昌学
2023-03-14

我想使用正则表达式验证输入字段的语法。该字段应接受如下示例中的文本:

Something=Item1,Item2,Item3
someOtherThing=Some_Item

必须有一个单词、一个符号和一列逗号分隔的单词。列表必须至少包含一个条目。因此,abc应该无效,但abc=123有效。

我使用的框架允许正则表达式(Java)将输入字段标记为有效或无效。如何在正则表达式中表达此规则?

在https://stackoverflow.com/a/65244969/7821336的帮助下,我能够验证逗号分隔的列表。但是一旦我在我的东西前面加上赋值,正则表达式就不再工作了:

(\w+)=((?:\w+)+),?   // does not work!

共有3个答案

邓浩漫
2023-03-14

您没有在组中重复逗号,这就是为什么当有多个逗号分隔值时它不起作用。

如果您想获得键和值的单独匹配,可以使用\G锚定。

(?:^(\w+)=|\G(?!^))(\w+)(?:,|$)

解释

  • (?:非捕获组
    • ^(\w)=断言字符串的开始并在组1中捕获1个单词字符
    • |
    • \G(?! ^)在前一场比赛结束时断言位置,而不是在开始时

    正则表达式演示|Java演示

    例如:

    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
    

孔嘉茂
2023-03-14

尝试此正则表达式

\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+)*
芮歌者
2023-03-14

我使用了这段代码,但它不使用任何正则表达式。代码:

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

在这里测试后,您可以看到它的运行情况。此外,这些是在此代码中完成的检查:

  1. 它将检查=符号前的文本是否为空
  2. 它将检查是否有=符号
  3. 它将检查项目是否为空
  4. 它还将为我们提供该列表中的项目列表
 类似资料:
  • 关于正则表达式有很多类似的问题,但我仍然对以下情况感到困惑:

  • 本文向大家介绍JS正则表达式验证中文字符,包括了JS正则表达式验证中文字符的使用技巧和注意事项,需要的朋友参考一下 正则表达式:"^[\u4e00-\u9fa5]{0,}$" 、 "/^[\u4E00-\u9FA5]{1,5}$/" 的含义: 在JS里,\uXXXX 是转义字符,"XXXX"对应的是16进制Unicode编码; ^ 匹配一行的开始。例如正则表达式^123能够匹配字符串"12345"

  • 本文向大家介绍请用正则表达式验证数字相关面试题,主要包含被问及请用正则表达式验证数字时的应答技巧和注意事项,需要的朋友参考一下 /[0一9]*$/

  • 问题内容: 我想在PHP中测试正则表达式的有效性,最好在使用前进行测试。这样做的唯一方法是实际尝试a 并查看是否返回吗? 有没有更简单/正确的方法来测试有效的正则表达式? 问题答案: 正如用户 pozs 所说,还应 考虑在测试环境中 放在 preg_match() () 前面, 以防止发出警告或通知。 要验证RegExp只需对其运行 (无需知道您要预先测试的数据) 。如果返回显式false(),则

  • 我需要一个只有文字的明文,不包括所有数字、额外空格、破折号、逗号、点、括号等。它用于文字生成算法(取自gamasutra)。我想正则表达式在这里会有所帮助。我如何在String.split的帮助下做到这一点? UPD: 输入:我有1337这样一个字符串,其中包含不同的内容:逗号、许多空格、数字-2 3 4、破折号。如何删除所有内容? 输出:我有这样一个字符串,里面有不同的东西,逗号,很多空格,数字

  • 我有一个包含数千行的文本文件。这里有一个例子 我试图提取'nt60'、'nt50'末尾的字符串。 问题是会包含行尾字符() 我想使用正则表达式搜索来匹配从 (') 开始的字符串,但我不知道我应该用什么来匹配 。 有人能帮忙吗?