使用正则表达式匹配字符串的开头和结尾[Java]

时间:2013-08-30 02:08:25

标签: java regex string-matching

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

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

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

我尝试了以下

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

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

5 个答案:

答案 0 :(得分:11)

我对你特别要求的东西感到有点困惑

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

Regular expression visualization

这将匹配迷宫(任何数字).in

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

Regular expression visualization

这将匹配迷宫(任何数字).in.txt - 排除.txt无需使用子字符串!

Edit live on Debuggex

我认为我现在要警惕的是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任何文件名的一般情况,如果您想特别匹配mazein,您可以将它们添加为文字字符串。

"maze\\d+\\.in"

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

答案 4 :(得分:0)

name.matches("^maze[0-9]+\\.in\\.txt$")