2

我有一个文件夹中的文件列表:

maze1.in.txt
maze2.in.txt
maze3.in.txt

我使用子字符串删除了 .txt 扩展名。如何使用正则表达式匹配文件名的前后?我需要它来匹配前面的“maze”和后面的“.in”,中间必须是一个数字(可以是一位数或两位数)。

我试过以下

if (name.matches("name\\din")) {
    //dosomething
}

它不匹配任何东西。要使用的正确正则表达式是什么?

4

5 回答 5

13

我对您特别要求的内容感到有些困惑

    ^(maze[0-9]*\.in)$

正则表达式可视化

这将匹配 maze(any number).in

 ^(maze[0-9]*\.in)\.txt$

正则表达式可视化

这将匹配 maze(any number).in.txt - 不包括 .txt NO NEED FOR USING SUB STRING!

在 Debuggex 上实时编辑

我现在要警惕的是捕获组......我不太确定你在用这个正则表达式做什么。但是,我相信解释捕获组可能会使您受益。

例如,捕获组由 () 表示,这基本上是将它们存储在模式数组中,并且是一种解析内容的方法。

例如 maze1.in.txt

因此,如果您想捕获整行减去 .txt,我会使用它^(maze[0-9]*\.in\.txt)$

但是,如果我想单独捕获事物,我会这样做,^(maze)([0-9]*)(\.in)\.txt$这将排除 .txt 但包括迷宫、数字和 .in IN 模式数组的单独索引。

于 2013-08-30T04:37:54.497 回答
2

您的原始解决方案不起作用,因为字符串“名称”不在您的文本中。这是“迷宫”。
你可以试试这个

name.matches("maze\\d{1,2}\\.in")

d{1,2} 用于匹配一个数字(可以是一位数或两位数)。

于 2013-08-30T04:22:14.300 回答
1

您需要正则表达式锚来告诉正则表达式

从头开始:^

并表示字符串的结尾:$

^maze[\d]{0,2}\.in$

或在 Java 中:

name.matches("^maze[\\d]{0,2}\\.in$");

.此外,您的正则表达式与不接受您给出的示例的点 () 不匹配字符串。您需要添加\.到正则表达式以接受点,因为.它是一个特殊字符。

于 2013-08-30T02:24:35.160 回答
0
name.matches("^maze[0-9]+\\.in\\.txt$")
于 2013-08-30T02:25:35.947 回答
0

在创建正则表达式之前,最好先想想你想用英语做什么。

您想要匹配一个单词maze后跟一个数字,然后是一个文字句点,.然后是另一个单词。

word   `\w` matches a word character
digit  `\d` matches a single digit
period `\.` matches a literal period
word   `\w` matches a word character

将它们放在一个字符串中(请记住 Java 转义的双反斜杠和重复上一次匹配一次或多次的优点):

"\\w+\\d\\.\\w+"

以上是格式中任何文件名的通用情况xxx1.yyy,如果您想匹配mazein特别是,您可以将它们添加为文字字符串。

"maze\\d+\\.in"

示例:http: //ideone.com/rS7tw1

于 2013-08-30T02:15:40.897 回答