我有一个文件夹中的文件列表:
maze1.in.txt
maze2.in.txt
maze3.in.txt
我使用了substring来删除.txt扩展名。 如何使用正则表达式匹配文件名的正面和背面? 我需要它来匹配前面的“迷宫”和后面的“.in”,中间必须是一个数字(可以是单个或两个数字)。
我尝试了以下
if (name.matches("name\\din")) {
//dosomething
}
它与任何东西都不匹配。使用正确的正则表达式是什么?
答案 0 :(得分:11)
我对你特别要求的东西感到有点困惑
^(maze[0-9]*\.in)$
这将匹配迷宫(任何数字).in
^(maze[0-9]*\.in)\.txt$
这将匹配迷宫(任何数字).in.txt - 排除.txt无需使用子字符串!
我认为我现在要警惕的是capture groups ......我不是特别相信你正在用这个正则表达式做什么。但是,我相信解释捕获组可能会让你受益。
例如,一个捕获组用()表示,它基本上将它们存储在模式数组中,并且是一种解析东西的方法。
示例maze1.in.txt
因此,如果您想捕获整个行减去.txt,我将使用此^(maze[0-9]*\.in\.txt)$
但是,如果我想单独捕获内容,我会执行此操作^(maze)([0-9]*)(\.in)\.txt$
这将排除.txt,但在模式数组的单独索引中包含迷宫,数字和.in。
答案 1 :(得分:1)
你需要正则表达式锚点告诉正则表达式
从头开始:^
并发出字符串结尾的信号:$
^maze[\d]{0,2}\.in$
或在Java中:
name.matches("^maze[\\d]{0,2}\\.in$");
此外,您的正则表达式不匹配带有点(.
)的字符串,它不接受您给出的示例。您需要将\.
添加到正则表达式以接受点,因为.
是一个特殊字符。
答案 2 :(得分:1)
原始解决方案不起作用,因为字符串“name”不在您的文本中。这是“迷宫”。
你可以试试这个
name.matches("maze\\d{1,2}\\.in")
d {1,2}用于匹配数字(可以是单数字或双数字)。
答案 3 :(得分: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
的任何文件名的一般情况,如果您想特别匹配maze
和in
,您可以将它们添加为文字字符串。
"maze\\d+\\.in"
答案 4 :(得分:0)
name.matches("^maze[0-9]+\\.in\\.txt$")