为什么正则表达式无法正常工作?

时间:2017-01-04 03:14:33

标签: java regex

我有一些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());
    }
}

在在线编辑器中,我找到了匹配项。但是,这些并不会在程序的实际运行中按预期返回任何内容。如何更改正则表达式以正常工作并可能更好地工作?

1 个答案:

答案 0 :(得分:1)

按顺序点

  1. 标准#1指出s3://已修复,因此您可以明确使用它。
  2. 您需要转义特殊的正则表达式字符,例如.-/。因为您正在将正则表达式编写为Java字符串,所以您需要使用两个反斜杠:\\.以匹配文字.
  3. 看起来你可以简化你的模式。
  4. 我不确切知道findMatchUsingRegex应该做什么,但请确保您要Pattern.find使用Pattern.match
  5. 解决方案

    s3:\/(\/[0-9A-Za-z\-\.]+)+

    请注意\/的首位,因此字符串必须以数字,字母.-结尾。在Java中,您需要将其写为:

    s3:\\/(\\/[0-9A-Za-z\\-\\.]+)+

    (从技术上讲,你不需要在这里逃避-.。但这可能是一种很好的做法,因为它们是特殊字符。)