我有一些String
喜欢
s3://my-source-bucket/molomics/molecules35455720556210282.csv
或者,
s3://my-source-bucket/molecules10282.csv
s3://my-source-bucket/molename
标准:
1. the portion of `s3://` is fixed
2. the bucket name will be consists of letters, numbers and dash(-) and dots(.), say,
my-source-bucket and will be followed by /
3. Number 2 will repeat one or more time
4. In the end there will be no /
我想使用正则表达式匹配它们。我有这个小程序,用于获取下面提供的匹配,
public static void findMatchUsingRegex(String input) {
String REGEX = "(w+://)([0-9A-Za-z-]+/)([0-9A-Za-z-/]+)([0-9A-Za-z-.]+)?";
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(input); // get a matcher object
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
在在线编辑器中,我找到了匹配项。但是,这些并不会在程序的实际运行中按预期返回任何内容。如何更改正则表达式以正常工作并可能更好地工作?
答案 0 :(得分:1)
s3://
已修复,因此您可以明确使用它。.
,-
和/
。因为您正在将正则表达式编写为Java字符串,所以您需要使用两个反斜杠:\\.
以匹配文字.
。findMatchUsingRegex
应该做什么,但请确保您要Pattern.find
使用Pattern.match
。 s3:\/(\/[0-9A-Za-z\-\.]+)+
请注意\/
的首位,因此字符串必须以数字,字母.
或-
结尾。在Java中,您需要将其写为:
s3:\\/(\\/[0-9A-Za-z\\-\\.]+)+
(从技术上讲,你不需要在这里逃避-
和.
。但这可能是一种很好的做法,因为它们是特殊字符。)