gpt4 book ai didi

java - 列表对象需要正则表达式支持

转载 作者:行者123 更新时间:2023-11-29 08:22:26 26 4
gpt4 key购买 nike

我有以下程序,

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

public class Regex {
public static void main(String[] args) {
String VALID_GUID_REGEX = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}";
Pattern NOT_PREFIXED_FILES_REGEX =
Pattern.compile("(^"+VALID_GUID_REGEX+"/\\b(foo|bar)\\b.*)|^[^/]+$");

List<String> list = new ArrayList<>();
list.add("256a5037-9fc1-4e60-95c3-523d5ae1c935/foo/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a");
list.add("256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a");
list.add("govcorp/123a5037-9fc1-4e60-95c3-523d5ae1c935/foo/text.doc");
list.add("156a5037-9fc1-4e60-95c3-523d5ae1c935/123a5037-9fc1-4e60-95c3-523d5ae1c935/delta/text.doc");
list.add("123a5037-9fc1-4e60-95c3-523d5ae1c935/");

String[] keys = list.stream()
.filter(k -> NOT_PREFIXED_FILES_REGEX.matcher(k).find())
.toArray(String[]::new);

System.out.println(Arrays.toString(keys));
}
}

除了列表中的最后一项,代码工作正常,我需要满足以下条件,

256a5037-9fc1-4e60-95c3-523d5ae1c935/foo/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a   -- Pass
256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a -- Pass
govcorp/123a5037-9fc1-4e60-95c3-523d5ae1c935/foo/text.doc -- Fail
156a5037-9fc1-4e60-95c3-523d5ae1c935/123a5037-9fc1-4e60-95c3-523d5ae1c935/foo/text.doc -- Fail
123a5037-9fc1-4e60-95c3-523d5ae1c935/ - Pass

让我们考虑第一行,

256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a 

如果我输入“256a5037-9fc1-4e60-95c3-523d5ae1c935/” - 通过和“256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/” - 通过,我正在从服务器获取文件路径。

让我们考虑失败案例,“govcorp/” - 失败和“govcorp/123a5037-9fc1-4e60-95c3-523d5ae1c935/” - 失败

如果两个GUID顺序case应该是FAIL,比如

156a5037-9fc1-4e60-95c3-523d5ae1c935/123a5037-9fc1-4e60-95c3-523d5ae1c935/- 失败

如果只有一个 GUID 大小写,例如“123e4567-e89b-12d3-a456-426655440001/” - 通过

最佳答案

在这里,我们首先使用一个简单的表达式来使不需要的字符串失效:

^((?!\.doc).)*$

Demo 1

然后对于剩余的字符串,我们将设计第二个表达式,在这种情况下,您的原始表达式工作得很好,我们可能只想用捕获组包装它:

([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})

Demo 2

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})";
final String string = "256a5037-9fc1-4e60-95c3-523d5ae1c935/foo/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a\n"
+ "256a5037-9fc1-4e60-95c3-523d5ae1c935/bar/44434038019,2019-05-24T09:02:18.695Z,b4786bf4-157a-4f1b-a030-4c5416e1884a\n"
+ "123a5037-9fc1-4e60-95c3-523d5ae1c935/";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}

正则表达式电路

jex.im可视化正则表达式:

enter image description here

Reference

关于java - 列表对象需要正则表达式支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56496268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com