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

4
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” 的格式是不固定长度的字母数字字符,其中包括一个连字符,但从不以连字符开头。日期格式始终保持一致,年份总是在字符串后面,因此我目前的方法是匹配 -year,但我很难排除开头的内容。

感谢任何想法或建议。

编辑:更新了字符串。


2
file-type 部分怎么样,可以包含连字符吗?如果可以,还有什么使它与 string-i-want 不同吗? - Attila
文件类型可能包含连字符,也可能不包含。 - RandomUser
你不能排除开头的部分,因为你没有足够清晰地定义它是什么。从你目前的描述中,需要额外的假设才能区分“type-string-i-want”和“string-i-want”,甚至是“i-want”或“want”。 - Sergey Kalinichenko
@Hoofamon - 在这种情况下,你需要找到另一个区分这两个部分的特征(例如,string-i-want 始终包含特定数量的连字符),否则无法使用正则表达式区分它们。 - Attila
@Hoofamon 如果 file-type 可能包含连字符,你如何区分 "string-i-want""type-string-i-want" - Sergey Kalinichenko
3个回答

4
这是您需要的正则表达式:
```\\-([^-]+\\-[^-]+)\\-\\d{4}\\-```
基本上它的意思是:
- 以`-`开头 - 包含一个或多个非`-`字符,然后是一个`-`,再然后是一个或多个非`-`字符。这部分被捕获。 - `-`和四个数字 但是,只有在`stuff-you-need`中只有一个连字符(或恒定数量的连字符,需要在正则表达式中进行更正)时才能起作用。否则,无法知道给定字符串`file-type-string-i-want`中单词`type`是否属于所需的字符串。 添加: 如果`file-type`始终只包含一个连字符,则可以通过以下方式捕获所需的部分:
```[^-]+\\-[^-]+\\-(.*)\\-\\d{4}\\-```
解释如下:
- `[^-]+\\-[^-]+\\-`一些非连字符字符,然后是一个连字符,再然后是更多的非连字符字符。这将跳过带有以下连字符的`file-type`字符串。 - `\\-\\d{4}\\-`一个连字符,四个数字,后面再跟一个连字符。 - `(.*)`在前两个语句之间的所有内容都被捕获为您需要选择的字符串。

我并不认为捕获的内容应该恰好包含一个连字符……只是连字符是该字符串部分的有效字符。 - jpm
这个问题在这部分有点令人困惑:“不幸的是,“我想要的字符串”的格式是长度不固定的字母数字字符,其中将包括一个连字符,但不会以连字符开头。”它是一个连字符还是任意数量的连字符? 它是一个连字符。 - bezmax
抱歉,实际上只有一个连字符,所以我应该说“string-iwant”。 - RandomUser
@Hoofamon,如果你在“__添加:__”之前的部分,那么这段代码适用于你。 - bezmax

0

我会为此目的使用带有正向先行断言的正则表达式:

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

这意味着匹配包含恰好一个连字符后跟一个连字符和四位数字年份的文本。

然后,您可以简单地获取matcher.group(0)作为匹配的文本,在这种情况下将是string-iwant


0
如果是 PHP,我会使用类似以下的代码来捕获该字符串。
/^(\w+\-){2}(?<string>.+?)\-\d{4}(\-\d{2}){5}(\.\w+){2}$/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接