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”的格式是一个非固定长度的字母数字字符,只包含一个连字符,但从不以连字符开头。日期格式是一致的,年份总是在字符串之后,所以我目前的方法是在年份匹配,但是我很难在开头排除这些东西。
感谢您的任何想法或想法
编辑:更新的字符串
答案 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
。