我想使用正则表达式验证输入字段的语法。该字段应接受如下示例中的文本:
Something=Item1,Item2,Item3
someOtherThing=Some_Item
必须有一个单词、一个符号和一列逗号分隔的单词。列表必须至少包含一个条目。因此,abc应该无效,但abc=123有效。
我使用的框架允许正则表达式(Java)将输入字段标记为有效或无效。如何在正则表达式中表达此规则?
在https://stackoverflow.com/a/65244969/7821336的帮助下,我能够验证逗号分隔的列表。但是一旦我在我的东西前面加上赋值,正则表达式就不再工作了:
(\w+)=((?:\w+)+),? // does not work!
您没有在组中重复逗号,这就是为什么当有多个逗号分隔值时它不起作用。
如果您想获得键和值的单独匹配,可以使用\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
尝试此正则表达式:
\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+)*
我使用了这段代码,但它不使用任何正则表达式。代码:
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;
}
}
在这里测试后,您可以看到它的运行情况。此外,这些是在此代码中完成的检查:
关于正则表达式有很多类似的问题,但我仍然对以下情况感到困惑:
本文向大家介绍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'末尾的字符串。 问题是会包含行尾字符() 我想使用正则表达式搜索来匹配从 (') 开始的字符串,但我不知道我应该用什么来匹配 。 有人能帮忙吗?