希望有人可以帮助我......或者至少指出我正确的方向。
首先,我有一堆名称如下的文件:
vendor.2012-07-25
vendor.2012-07-25 2
ven_dor.2012-05-18
ven_dor.2012-05-18 2
基本上是供应商名称(有时一个字,有时两个带下划线)+(句号“。”)+(年)+(月)+(日)。年,月,日由( - )分隔。可能是多个具有相同名称的文件,在日期之后用2/3/4等表示。
我通过file.getName()获取这些作为字符串;其中'file'是JFileChooser中选定的文件
然后我需要根据日期绘制一些数据。我应该尝试将初始文件名字符串拆分为“。”首先,将供应商和日期分开,然后将剩余部分拆分/除以“ - ”以得到年/月/日的个别值?
我以为这可能是一个正则表达式的东西,但我在那个领域相当弱......所以我想出的是双重分裂。有人有意见或建议吗?谢谢!
答案 0 :(得分:3)
确实,您可以使用regular expression:
String s = "vendor.2012-07-25 2";
Pattern p = Pattern.compile("([^.]+)\\.(\\d{4})-(\\d{2})-(\\d{2}) ?(\\d?)");
Matcher m = p.matcher(s);
if (m.find()) {
String vendorName = m.group(1);
String year = m.group(2);
String month = m.group(3);
String day = m.group(4);
String multipleFiles = m.groupCount() > 4 ? m.group(5) : "";
System.out.printf("%s %s %s %s %s", vendorName, year, month, day, multipleFiles);
}
用括号()
包装的每个表达式称为捕获组,它基本上告诉正则表达式引擎保存其内容,以便以后可以检索它。
总而言之,这是每个捕获组所做的事情:
([^.]+)
- 除了点(.
)之外的所有内容,因此我们基本上捕获供应商名称部分; (\\d{4})
- \d
匹配一个数字。 \d{4}
匹配4
位数(年); (\\d{2})
- 月; (\\d{2})
- Day; (\\d?)
- 匹配可选的(?
)最后一位数。如果要将日期部分解析为java.Util.Date
实例,可以使用单个捕获组,然后使用SimpleDateFormat
:
Pattern p = Pattern.compile("([^.]+)\\.(\\d{4}-\\d{2}-\\d{2}) ?(\\d?)");
Matcher m = p.matcher(s);
if (m.find()) {
String vendorName = m.group(1);
String dateString = m.group(2);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String multipleFiles = m.groupCount() > 2 ? m.group(3) : "";
}
答案 1 :(得分:1)
String.split
上的.
(可能需要转义)。将dotSplitString[1]
作为vendor.
或ven_dor.
(spaceSplitString
)。 DateFormat.parse(String)
解析第一部分以获得Date
spaceSplitString
)的第二部分存在,请使用Integer.parseInt(spaceSplitString[1])
答案 2 :(得分:0)
Java API String Tokenizer class
你能做的是:
tokenizer = new StringTokenizer(file.getName(), ".");
tokenizer.nextElement();
你得到的照片,或者你也可以使用扫描仪来解析它
答案 3 :(得分:0)
我倾向于在代码中大量使用StringTokenizers。要标记上面的示例,您可以使用类似于以下内容的内容:
StringTokenizer tok = new StringTokenizer(filename,".-"); //tokenizes both on '.' and '-' String name = tok.nextToken(); int year = Integer.parseInt(tok.nextToken()); int month = Integer.parseInt(tok.nextToken()); int day = Integer.parseInt(tok.nextToken()); int cnt = 1; //default one copy of the file if(tok.hasMoreTokens()){ cnt = Integer.parseInt(tok.nextToken()); }
......等等。
然而,我赞同使用上面的正则表达式解决方案,不仅仅是因为它对外行人来说看起来不那么容易理解。为了完整性,请在此处加入。