有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java正则表达式在字符串中间查找匹配字符串

我需要验证文件输入,以确保其具有正确的版本控制。例如,这是输入文件:W:\\folder\\test_v2301_01_29_2014_1420.pfd

我已经在Java中构建了一个正则表达式来查找我正在寻找的用于验证文件的版本控制字符串

RegEx:v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}但是,它失败了,因为RegEx正在查看文件的开头

调用:if (!arcvalFileFormBean.getTxtFileReview().matches("v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}"))

搜索字符串的最佳方法是什么,而不知道它离开始有多远


共 (2) 个答案

  1. # 1 楼答案

    您也可以先编译模式,创建匹配器实例,然后在返回的匹配器上调用find(),而不是向正则表达式添加前导和尾随的match all参数

    Pattern pattern = Pattern.compile("v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}");
    Matcher matcher = pattern.matcher(arcvalFileFormBean.getTxtFileReview());
    
    if (!matcher.find()) {
        ...
    }
    

    Matcher还提供了一个matches()操作,尽管它的行为与String中的Matcher函数相同,因为它仅在整个字符串与RegEx模式匹配时返回true

    模式/匹配器构造可用于发现某个子字符串是否与模式匹配,如果匹配,则替换该字符串的某些部分。也就是说,我们使用这种方法是为了使用自定义的LogbackCompositeConverter来屏蔽日志语句中的某些密码,该LogbackCompositeConverter包含如下所示的类似逻辑:

    Pattern urlAuthPattern = Pattern.compile("//(.*?):.*?@");
    Matcher matcher = urlAuthPattern.matcher("ftp://user1:userPW@localhost:21/path/to/somewhere");
    if (matcher.find()) {
        // should return ftp://user1:XXX@localhost:21/path/to/somewhere
        return matcher.replaceAll("//$1:XXX@");
    }
    
  2. # 2 楼答案

    试试这个:

    if (!arcvalFileFormBean.getTxtFileReview().matches(
                   ".*?v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}.*"))
    

    String#matches尝试匹配完整的输入,因此.*?在您的regex版本之前和.*之后将确保此模式在输入中的任何地方都匹配