【问题标题】:Matching contents of a String with a pattern将字符串的内容与模式匹配
【发布时间】:2010-12-17 12:12:37
【问题描述】:

我正在努力创建一个正则表达式匹配模式,以与 String 的 match() 方法一起使用。 我的字符串值类似于 -

3012145A_20348409-146139460.ABCDxyzPQr.1.1.xml

我正在使用 String.matches("regex") 方法,但老实说,我在努力创建与此类字符串值匹配的模式。 我确实尝试了一些不同的组合,但徒劳无功。在互联网上搜索了一些示例。 尽管长度可能会有所不同,但这些值始终采用相似的格式。

非常感谢任何帮助。


仅匹配 .xml
好吧,除了给出的示例之外,列表中还会有其他值,所以我需要匹配

3012145A_20348409-146139460.ABCDxyzPQr.1.1.xml  

值列表可能是 -

3012145A_20348409-146139460.ABCDxyzPQr.1.1.xml
3012145_Error.xml
3012145_UK.pdf
3012145A_20348409.ABC.10.10.10.xml

我需要这些中的第一个值

(alphanum)(underscore)(num)(hyphen)(num)(dot)(aLpHa)(dot)(num)(dot)(num)(dot)(.xml)  

我试过了-

s.matches("[a-zA-Z0-9]_[0-9]-[0-9].[a-zA-Z].[0-9].[0-9].xml");

【问题讨论】:

  • 你想匹配什么,即规则是什么?任何以“.xml”结尾的内容还是有更多内容?
  • 我同意。在表达你的正则表达式之前,你应该知道你的字符串的正式定义。这将匹配:\w+_\d+-\d+\.\w+\.\d\.\d\.xml。但这也是.*?\.xml。还有更多...
  • 您应该添加更多示例来说明您想要匹配的内容和不应该匹配的内容。
  • (dot)(.xml) 转换为正则表达式 \.\.xml,与 ..xml 匹配。我很确定这不是你想要的。
  • 糟糕,我的错误。你是对的。

标签: java regex string


【解决方案1】:

要求:

(alphanum)(underscore)(num)(hyphen)(num)(dot)(aLpHa)(dot)(num)(dot)(num)(dot)(.xml)

假定的正则表达式:

\w*_\d*-\d*\.([a-zA-Z])*\.\d*\.\d*(\.)?\.xml

在 java 中,这将转换为:

Pattern p = Pattern.compile("\\w*_\\d*-\\d*\\.([a-zA-Z])*\\.\\d*\\.\\d*(\\.)?\\.xml",Pattern.CASE_INSENSITIVE);

注意

由于我使用的是[a-zA-Z],您可能不需要Pattern.CASE_INSENSITIVE

您的正则表达式有问题:s.matches("[a-zA-Z0-9]_[0-9]-[0-9].[a-zA-Z].[0-9].[0-9].xml");

您正在寻找alphanumberalphanumeric 的单个实例。使用*+ 元字符。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    太棒了!非常感谢 Favonius。
    效果很好。
    因此,据我所知,即使我给出了一个范围 [0-9a-zA-Z],它实际上只是试图匹配第一个字符,在我的示例中,3
    所以实际上不是3012145A,而是只检查3是否是我给定范围的一部分([0-9a-zA-Z])等等。
    您的解决方案\w* 将检查该特定部分是否为字母数字或\d* 将检查该部分(以边界为界,例如._)是否在整个数字和/或字母范围内。

    所以匹配3012145A_ 的一种非常模糊的方式可能是

    [0-9][0-9][0-9][0-9][0-9][0-9][0-9][a-zA-Z]_
    

    我提出这个解决方案并不是为了了解[0-9]\d* 之间的行为和区别。

    我还有一个问题,(\\.)?\\. 的意义,这是什么目的。

    再次感谢

    【讨论】:

    • 我认为(\\.)?\\. 存在是因为您的规范中有错误。有关详细信息,请参阅我在问题下的评论。
    • Alrite,如果我不包括 (\\.)?\\.在我的正则表达式中,它仍然很好。我的意思显然是我的规范以 (num)(dot)(xml) 或 (num)(.xml) 结尾。不过,我想知道它意味着什么。因为,我相信它翻译成.?.,所以是?喜欢任何单个字符
    • @user538058: (\\.)?\\. 它表示 单个 出现 DOT 后跟 DOT 。正如艾伦所说,这是因为你的规格。因此,您可以使用Pattern p = Pattern.compile("\\w*_\\d*-\\d*\\.([a-zA-Z])*\\.\\d*\\.\\d*\\.xml",Pattern.CASE_INSENSITIVE);,而不是使用(\\.)?\\. :)
    • @user538058:是的,使用[0-9][0-9][0-9][0-9][0-9][0-9][0-9][a-zA-Z]_ 匹配 3012145A_ 是一种非常模糊的方式。 \d[0-9] 的简写。 \d* 表示出现零个或多个数字。阅读一些正则表达式教程以获取更多详细信息。
    • 优秀。非常感谢所有的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多