我有多种类型的字符串,如:
ProjectOne
ProjectOne-2017-05-03
ProjectOne_version2
ProjectOne-2017-04-24
ProjectOne-2017-04-10_Version2
ProjectTwo
ProjectTwo-2016-11-12
...
我想找到一种使用正则表达式(或最简单)来提取项目名称和项目日期的方法。我的目标是为每个项目保留最近的版本(基于其日期,只有名称或名称和版本的版本被认为比具有日期的版本更旧)
有没有办法使用正则表达式提取这些不同的子串?我读了一下它,这很令人困惑。
答案 0 :(得分:1)
输入数据没有遵循任何/很多规则的问题:确定其内容硬。
换句话说:首先你必须退后一步,查看所有数据;为了发现"模式"在数据集中。然后,您会想到可用于将条目放入不同存储桶的规则。
示例:
ProjectOne-2017年4月24日
似乎有些条目遵循以下规则:
name separator iso-date
这意味着:简单的首先检查是确定传入的字符串是否与
匹配(\w+)[-_](\d{4}[-_]\d{2}[-_]\d{2})
此正则表达式匹配:
上述内容仅仅意味着"灵感&#34 ;;最后,它是你的项目;所以你必须坐下来学习和理解正则表达式。您可以here开始了解此类模式的规则。或here获取有关该主题的完整教程。
长话短说:没有弯路 - 不要期望SO为你提供一个解决你所有问题的魔法正则表达式;特别是考虑到你对你打算使用的概念缺乏必要的理解。
答案 1 :(得分:1)
您有很多情况,因此您可以使用群组,例如:
(project\\w+)[-_]
匹配项目名称([0-9]{4}-[0-9]{2}-[0-9]{2})
以匹配日期version\\d+
以匹配项目的版本所以你的代码应该是这样的:
public static void main(String[] args) {
String projects[] = {"ProjectOne-2017-05-03", "ProjectOne_version2",
"ProjectOne-2017-04-24", "ProjectTwo-2016-11-12",
"ProjectOne-2017-04-10_Version2"};
for (String project : projects) {
System.out.println("Input : " + project);
Pattern pattern = Pattern.compile("(?i)(project\\w+)[-_]|([0-9]{4}-[0-9]{2}-[0-9]{2})|(version\\d+)");
Matcher matcher = pattern.matcher(project);
while (matcher.find()) {
if (matcher.group(1) != null) {
System.out.println(matcher.group(1));
}
if (matcher.group(2) != null) {
System.out.println(matcher.group(2));
}
if (matcher.group(3) != null) {
System.out.println(matcher.group(3));
}
}
System.out.println("******************************************");
}
}
<强>输出强>
Input : ProjectOne-2017-05-03
ProjectOne
2017-05-03
******************************************
Input : ProjectOne_version2
ProjectOne
version2
******************************************
Input : ProjectOne-2017-04-24
ProjectOne
2017-04-24
******************************************
Input : ProjectTwo-2016-11-12
ProjectTwo
2016-11-12
******************************************
Input : ProjectOne-2017-04-10_Version2
ProjectOne
2017-04-10
Version2
******************************************