Java正则表达式字符串解析,试图找出一个模式

时间:2012-03-27 14:50:39

标签: java regex

File file = new File("file-type-string-i-want-2000-01-01-01-01-01.conf.gz");
            Matcher matcher = pattern.compile("\\-(.*)\\-\\d{4}")).matcher(fileName);
            StringBuilder sb = new StringBuilder();
            while (matcher.find()) {
                sb.append(matcher.group());
            }
            stringList = Arrays.asList(sb.toString().split("-"));
            if (stringList.size() >= 2) {
                nameFragment = stringList.get(stringList.size() - 2);
            }

期望的结果是提取

string-iwant 

来自看起来像这样的字符串

file-type-string-iwant-2000-01-01-01-01-01.conf.gz 

不幸的是,“string-iwant”的格式是一个非固定长度的字母数字字符,只包含一个连字符,但从不以连字符开头。日期格式是一致的,年份总是在字符串之后,所以我目前的方法是在年份匹配,但是我很难在开头排除这些东西。

感谢您的任何想法或想法

编辑:更新的字符串

3 个答案:

答案 0 :(得分:4)

这是你需要的正则表达式:

\\-([^-]+\\-[^-]+)\\-\\d{4}\\-

基本上它意味着:

  • -以减号
  • 开头
  • ([^-]+\\-[^-]+)包含1个或多个非减号,然后是减号,然后是1个或多个非减号。这部分被捕获。
  • -\d{4}减号和4位

但是,只有当stuff-you-need只有一个连字符(或连续数量的连续符号,需要在正则表达式中进行校正)时才会有效。否则,无法知道字符file-type-string-i-want是否属于您想要的字符type

<强>加了:

如果file-type始终只包含一个连字符,您可以通过这种方式捕获所需的部分:

[^-]+\\-[^-]+\\-(.*)\\-\\d{4}\\-

说明:

  • [^-]+\-[^-]+\\-一些非连字符,然后是连字符,然后是更多的非连字符。这将使用以下连字符跳过file-type字符串。
  • \-\d{4}\-连字符,4位数后跟另一个连字符
  • (.*)前两个语句之间的所有内容都被捕获为您需要选择的字符串

答案 1 :(得分:0)

如果是PHP,我会使用类似下面的内容来捕获该字符串。

/^(\w+\-){2}(?<string>.+?)\-\d{4}(\-\d{2}){5}(\.\w+){2}$/

答案 2 :(得分:0)

我将用于此目的的正则表达式具有积极的前瞻性:

Pattern p = Pattern.compile("[^-]+-[^-]+(?=-\\d{4})");

这仅仅意味着匹配包含正好一个连字符的文本,然后是一个连字符和一个4位数年份

然后,您只需抓住matcher.group(0)作为匹配的文字,在这种情况下为string-iwant