【问题标题】:Using regex to match beginning and end of string [Java]使用正则表达式匹配字符串的开头和结尾 [Java]
【发布时间】:2013-09-02 15:31:40
【问题描述】:

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

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

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

我尝试了以下方法

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

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

【问题讨论】:

  • 这在开始使用正则表达式时可能很有用debuggex.com

标签: java regex string-matching


【解决方案1】:

我对你具体要求什么感到有点困惑

    ^(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!

Edit live on Debuggex

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

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

示例 maze1.in.txt

所以如果你想捕获整行减去 .txt 我会使用这个^(maze[0-9]*\.in\.txt)$

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

【讨论】:

  • 您需要^,如果使用String.matches(),则需要$。它会自动尝试匹配整个字符串(是的,这没有记录)。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    从头开始:^

    并表示字符串的结尾:$

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

    或在 Java 中:

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

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

    【讨论】:

    • 其实String.matches() 不需要。它会自动尝试匹配整个字符串,就好像 ^$ 在那里一样。
    【解决方案4】:

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

    您想要匹配一个单词 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.yyyany 文件名的一般情况,如果您想专门匹配mazein,您可以将它们添加为文字字符串.

    "maze\\d+\\.in"
    

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

    【讨论】:

      【解决方案5】:
      name.matches("^maze[0-9]+\\.in\\.txt$")
      

      【讨论】:

        猜你喜欢
        • 2015-04-27
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 2023-01-02
        • 2016-03-26
        • 2013-08-04
        相关资源
        最近更新 更多